NumPy 官方文档精粹:中文解读与实例 – wiki基地

“`markdown

NumPy 官方文档精粹:中文解读与实例

NumPy (Numerical Python) 是 Python 科学计算生态系统的基石。它提供了一个强大的 N 维数组对象 (ndarray),以及一系列用于处理这些数组的函数。无论是进行数据分析、机器学习、图像处理还是复杂的科学模拟,NumPy 都是不可或缺的工具。然而,NumPy 的官方文档内容极其丰富详尽,对于初学者或希望快速掌握核心功能的开发者来说,可能会感到有些不知所措。

本文旨在从 NumPy 官方文档中提炼精粹,结合中文解读和实用的代码实例,帮助读者系统性地理解 NumPy 的核心概念和常用功能,为你高效利用这个强大的库打下坚实的基础。我们将涵盖从基础的 ndarray 对象到核心操作、广播机制、常用模块和一些进阶技巧。

一、 核心概念:NumPy 的基石 (ndarray)

NumPy 的核心是 ndarray (N-dimensional array) 对象。理解 ndarray 的特性是掌握 NumPy 的第一步。

1.1 ndarray 对象:多维同质数据容器

与 Python 内置的列表 (list) 不同,ndarray 具有以下关键特性:

  • 多维性 (N-dimensional): 可以表示从一维向量、二维矩阵到更高维度的张量。数组的维度称为“轴”(axis),维度的数量称为“秩”(rank)。
  • 同质性 (Homogeneous): 数组中的所有元素必须是相同的数据类型 (dtype)。这使得 NumPy 可以进行高度优化的、基于 C 语言底层的数值运算,速度远超 Python 列表。
  • 固定大小 (Fixed Size): 一个 ndarray 在创建时大小是固定的。改变数组的大小会创建一个新的数组,而不是在原地修改。

示例:

“`python
import numpy as np

从 Python 列表创建一维数组

arr1d = np.array([1, 2, 3, 4, 5])
print(f”一维数组:\n{arr1d}”)
print(f”数组维度 (秩): {arr1d.ndim}”) # 输出 1
print(f”数组形状: {arr1d.shape}”) # 输出 (5,)
print(f”数组数据类型: {arr1d.dtype}”) # 输出 int64 (或 int32, 取决于系统)

创建二维数组 (矩阵)

arr2d = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(f”\n二维数组:\n{arr2d}”)
print(f”数组维度 (秩): {arr2d.ndim}”) # 输出 2
print(f”数组形状: {arr2d.shape}”) # 输出 (2, 3)
print(f”数组数据类型: {arr2d.dtype}”) # 输出 float64
“`

1.2 数据类型 (dtype):精确控制内存与计算

dtype 是 NumPy 中一个非常重要的概念。它描述了数组中存储的数据类型,如整数、浮点数、布尔值等,以及它们占用的内存大小。显式指定 dtype 有助于:

  • 内存优化: 选择合适的类型可以节省内存。
  • 计算精度: 确保计算使用所需的精度。
  • 兼容性: 与其他 C/Fortran 库交互时,确保数据类型匹配。

常用 dtype 包括:int8, int16, int32, int64, uint8 (无符号整型), float16, float32, float64, complex64, complex128, bool, object (用于存储 Python 对象), string_, unicode_

示例:

“`python

创建时指定 dtype

arr_float32 = np.array([1, 2, 3], dtype=np.float32)
print(f”\n指定 float32 类型:\n{arr_float32}”)
print(f”数据类型: {arr_float32.dtype}”) # 输出 float32

类型转换

arr_int = arr_float32.astype(np.int64)
print(f”\n转换为 int64 类型:\n{arr_int}”)
print(f”数据类型: {arr_int.dtype}”) # 输出 int64
“`

1.3 数组创建:多样化的初始化方法

除了 np.array() 从现有数据创建数组外,NumPy 提供了多种便捷的数组创建函数:

  • np.zeros(shape, dtype=float): 创建指定形状的全零数组。
  • np.ones(shape, dtype=float): 创建指定形状的全一数组。
  • np.empty(shape, dtype=float): 创建指定形状的未初始化数组(其初始内容是随机的,取决于内存状态)。通常比 zerosones 稍快,但需要手动填充。
  • np.arange(start, stop, step, dtype=None): 类似 Python range,但返回 ndarray。包含 start,不包含 stop
  • np.linspace(start, stop, num=50, endpoint=True, dtype=None): 创建在 [start, stop] 区间内均匀分布的 num 个点组成的数组。endpoint 控制是否包含 stop 值。
  • np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None): 创建在对数尺度上均匀分布的点。
  • np.eye(N, M=None, k=0, dtype=float): 创建一个单位矩阵(对角线为1,其余为0)。N 是行数,M 是列数(默认为 N),k 是对角线索引(0 为主对角线)。
  • np.random 模块: 用于创建各种随机数组(详见后续章节)。

示例:

“`python

创建 3×4 的全零数组

zeros_arr = np.zeros((3, 4))
print(f”\n全零数组:\n{zeros_arr}”)

创建包含 0 到 9 的一维数组

arange_arr = np.arange(10)
print(f”\narange 数组:\n{arange_arr}”)

创建从 0 到 1 (包含) 均匀分布的 5 个点

linspace_arr = np.linspace(0, 1, 5)
print(f”\nlinspace 数组:\n{linspace_arr}”)

创建 3×3 的单位矩阵

eye_arr = np.eye(3)
print(f”\n单位矩阵:\n{eye_arr}”)
“`

二、 核心操作:数组的威力

NumPy 的核心优势在于其对 ndarray 进行高效操作的能力。

2.1 索引与切片 (Indexing and Slicing):灵活访问数据

NumPy 提供了比 Python 列表更强大、更灵活的索引和切片机制。

  • 基本索引: 与列表类似,使用 [] 访问元素,索引从 0 开始。对于多维数组,使用逗号分隔的索引元组 arr[row, col]
  • 切片 (Slicing): arr[start:stop:step]。可以对每个维度进行切片。切片返回的是原始数组的视图 (view),而不是副本。修改视图会影响原始数组。
  • 整数数组索引 (Integer Array Indexing / Fancy Indexing): 使用整数数组作为索引,可以选取任意指定位置的元素,返回的是副本 (copy)
  • 布尔数组索引 (Boolean Array Indexing): 使用布尔数组作为索引,选取对应 True 位置的元素,返回的是副本 (copy)。这在数据筛选时非常有用。

示例:

“`python
arr = np.arange(10, 20) # [10 11 12 13 14 15 16 17 18 19]
print(f”\n原始数组: {arr}”)

基本索引

print(f”索引 3 的元素: {arr[3]}”) # 输出 13

切片 (获取索引 2 到 5 的元素,不含 5)

slice_arr = arr[2:5]
print(f”切片 [2:5]: {slice_arr}”) # 输出 [12 13 14]

修改切片视图会影响原数组

slice_arr[0] = 99
print(f”修改切片后,原始数组: {arr}”) # 输出 [10 11 99 13 14 15 16 17 18 19]

恢复原值以便后续示例

arr[2] = 12

二维数组索引与切片

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f”\n二维数组:\n{arr2d}”)
print(f”第 1 行 (索引 0): {arr2d[0]}”) # 输出 [1 2 3]
print(f”第 2 列 (索引 1): {arr2d[:, 1]}”) # 输出 [2 5 8]
print(f”元素 (1, 2): {arr2d[1, 2]}”) # 输出 6
print(f”子矩阵 (前两行,后两列):\n{arr2d[:2, 1:]}”)

输出:

[[2 3]

[5 6]]

整数数组索引 (Fancy Indexing)

indices = np.array([0, 2, 0, 1]) # 选择索引 0, 2, 0, 1 的元素
print(f”\nFancy Indexing (整数数组): {arr[indices]}”) # 输出 [10 12 10 11]

arr2d_indices = np.array([0, 2]) # 选择第 0 行和第 2 行
print(f”Fancy Indexing (二维行选择):\n{arr2d[arr2d_indices]}”)

输出:

[[1 2 3]

[7 8 9]]

布尔数组索引

bool_idx = arr > 15
print(f”\n布尔索引条件 (arr > 15): {bool_idx}”) # 输出 [False False False False False False True True True True]
print(f”布尔索引结果: {arr[bool_idx]}”) # 输出 [16 17 18 19]

布尔索引 + 赋值

arr[arr % 2 == 0] = -1 # 将所有偶数替换为 -1
print(f”布尔索引赋值后: {arr}”)

恢复原值

arr = np.arange(10, 20)
“`

2.2 基本运算:向量化的高效计算

NumPy 允许对整个数组执行数学运算,而无需编写显式的 Python 循环。这种操作称为向量化 (Vectorization),它利用底层 C 代码实现,速度极快。

  • 标量运算: 数组与单个数值(标量)的运算会作用于数组的每个元素。
  • 数组间运算: 形状相同的数组之间的算术运算 (+, -, , /, //, %, *) 是按元素 (element-wise) 进行的。

示例:

“`python
arr_a = np.array([1, 2, 3, 4])
arr_b = np.array([10, 20, 30, 40])

标量运算

print(f”\n数组 + 5: {arr_a + 5}”) # 输出 [ 6 7 8 9]
print(f”数组 * 2: {arr_a * 2}”) # 输出 [2 4 6 8]

数组间运算 (element-wise)

print(f”\n数组 A: {arr_a}”)
print(f”数组 B: {arr_b}”)
print(f”A + B: {arr_a + arr_b}”) # 输出 [11 22 33 44]
print(f”B – A: {arr_b – arr_a}”) # 输出 [ 9 18 27 36]
print(f”A * B: {arr_a * arr_b}”) # 输出 [ 10 40 90 160]
print(f”B / A: {arr_b / arr_a}”) # 输出 [10. 10. 10. 10.]
print(f”A ** 2: {arr_a ** 2}”) # 输出 [ 1 4 9 16]

比较运算也按元素进行,返回布尔数组

print(f”A > 2: {arr_a > 2}”) # 输出 [False False True True]
print(f”A == B: {arr_a == arr_b}”) # 输出 [False False False False]
“`

2.3 通用函数 (ufunc):高效的元素级函数

通用函数 (Universal Functions, ufuncs) 是对 ndarray 中的数据执行元素级操作的函数。它们是 NumPy 向量化实现的载体。ufuncs 可以是一元的(接受一个数组)或二元的(接受两个数组)。

常用 ufuncs 示例:

  • 一元 ufuncs:
    • np.sqrt(): 计算平方根
    • np.exp(): 计算指数 e^x
    • np.log(), np.log10(), np.log2(): 计算自然对数、底10对数、底2对数
    • np.sin(), np.cos(), np.tan(): 三角函数
    • np.abs(): 计算绝对值
    • np.ceil(), np.floor(): 向上、向下取整
    • np.isnan(): 判断是否为 NaN (Not a Number)
    • np.isfinite(), np.isinf(): 判断是否为有限数、无穷大
  • 二元 ufuncs:
    • np.add(), np.subtract(), np.multiply(), np.divide(): 对应 +, -, *, /
    • np.power(): 幂运算 (a^b)
    • np.maximum(), np.minimum(): 元素级的最大值、最小值
    • np.mod(): 模运算 (%)
    • np.copysign(): 将第二个数组元素的符号复制给第一个数组元素
    • np.greater(), np.less(), np.equal(), np.logical_and(), np.logical_or(), np.logical_xor(): 元素级比较和逻辑运算

示例:

“`python
arr = np.array([1, 4, 9, 16])
print(f”\n原始数组: {arr}”)
print(f”平方根: {np.sqrt(arr)}”) # 输出 [1. 2. 3. 4.]
print(f”指数 (e^x): {np.exp(arr)}”) # 计算 e 的相应次方

arr1 = np.array([1, 5, 3, 8])
arr2 = np.array([4, 2, 6, 1])
print(f”\n数组 1: {arr1}”)
print(f”数组 2: {arr2}”)
print(f”元素级最大值: {np.maximum(arr1, arr2)}”) # 输出 [4 5 6 8]
“`

2.4 聚合函数:数组统计与计算

NumPy 提供了许多聚合函数,用于对整个数组或沿某个轴进行计算。

  • np.sum(): 计算总和
  • np.mean(): 计算平均值
  • np.std(), np.var(): 计算标准差、方差
  • np.min(), np.max(): 计算最小值、最大值
  • np.argmin(), np.argmax(): 计算最小值、最大值的索引
  • np.cumsum(): 计算累积和
  • np.cumprod(): 计算累积积
  • np.any(): 检查是否有任何元素为 True
  • np.all(): 检查是否所有元素都为 True

这些函数都可以接受 axis 参数来指定沿哪个轴进行计算。如果不指定 axis,则对整个数组进行计算。

示例:

“`python
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(f”\n二维数组:\n{arr2d}”)

print(f”所有元素的总和: {np.sum(arr2d)}”) # 输出 21
print(f”沿列求和 (axis=0): {np.sum(arr2d, axis=0)}”) # 输出 [5 7 9]
print(f”沿行求和 (axis=1): {np.sum(arr2d, axis=1)}”) # 输出 [ 6 15]

print(f”所有元素的平均值: {np.mean(arr2d)}”) # 输出 3.5
print(f”沿行计算最大值: {np.max(arr2d, axis=1)}”) # 输出 [3 6]
print(f”沿列计算最小值索引: {np.argmin(arr2d, axis=0)}”) # 输出 [0 0 0]
“`

2.5 广播 (Broadcasting):不同形状数组的运算规则

广播是 NumPy 最强大的特性之一,它描述了 NumPy 在执行算术运算时如何处理不同形状的数组。当两个数组的形状不完全匹配时,NumPy 会尝试“广播”较小的数组,使其形状与较大的数组兼容,以便进行元素级运算。

广播规则:

  1. 维度对齐: 如果两个数组的维度数 (ndim) 不同,将维度较少的数组的形状在前面补 1,直到维度数相同。
  2. 兼容性检查: 从末尾开始逐个比较两个数组对应维度的大小:
    • 如果维度大小相等,则该维度兼容。
    • 如果其中一个维度的大小为 1,则该维度兼容(认为大小为 1 的维度可以“拉伸”以匹配另一个维度)。
    • 如果维度大小不同且没有一个为 1,则这两个数组不兼容,无法广播,会抛出 ValueError
  3. 运算执行: 如果所有维度都兼容,则可以执行运算。运算时,大小为 1 的维度会沿着该维度“扩展”或“复制”其值,以匹配另一个数组对应维度的大小。

示例:

“`python
arr_matrix = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
arr_vector = np.array([10, 20, 30])
scalar = 100

print(f”\n矩阵 (3×3):\n{arr_matrix}”)
print(f”向量 (3,): {arr_vector}”)
print(f”标量: {scalar}”)

矩阵 + 标量 (标量被广播到每个元素)

result1 = arr_matrix + scalar
print(f”\n矩阵 + 标量 (广播):\n{result1}”)

[[100 101 102]

[103 104 105]

[106 107 108]]

矩阵 + 向量 (向量被广播到每一行)

arr_matrix.shape: (3, 3)

arr_vector.shape: (3,)

1. 对齐维度: arr_vector 变为 (1, 3)

2. 兼容性检查:

– 维度 1 (末尾): 3 == 3 (兼容)

– 维度 0: 3 vs 1 (兼容, 1 可以扩展)

3. 运算: arr_vector 的行被复制 3 次与 arr_matrix 的行相加

result2 = arr_matrix + arr_vector
print(f”\n矩阵 + 向量 (广播):\n{result2}”)

[[10 21 32]

[13 24 35]

[16 27 38]]

如果需要按列广播,需要调整向量的形状

arr_col_vector = np.array([[10], [20], [30]]) # shape (3, 1)
print(f”\n列向量 (3, 1):\n{arr_col_vector}”)

arr_matrix.shape: (3, 3)

arr_col_vector.shape: (3, 1)

1. 维度相同 (2)

2. 兼容性检查:

– 维度 1 (末尾): 3 vs 1 (兼容, 1 可以扩展)

– 维度 0: 3 == 3 (兼容)

3. 运算: arr_col_vector 的列被复制 3 次与 arr_matrix 的列相加

result3 = arr_matrix + arr_col_vector
print(f”\n矩阵 + 列向量 (广播):\n{result3}”)

[[10 11 12]

[23 24 25]

[36 37 38]]

“`

广播使得代码更简洁、更高效,避免了不必要的数组复制和显式循环。

三、 常用模块与功能

NumPy 不仅仅是 ndarray 和基本运算,它还包含许多用于特定任务的子模块。

3.1 线性代数 (numpy.linalg)

提供了标准的线性代数运算功能。

  • np.dot(a, b)a @ b (Python 3.5+): 矩阵乘法(对于二维数组)或向量内积(对于一维数组)。
  • np.linalg.inv(a): 计算矩阵的逆。
  • np.linalg.det(a): 计算矩阵行列式。
  • np.linalg.eig(a): 计算方阵的特征值和特征向量。
  • np.linalg.svd(a): 计算奇异值分解 (SVD)。
  • np.linalg.solve(a, b): 解线性方程组 ax = b。
  • np.linalg.qr(a): 计算 QR 分解。

示例:

“`python
A = np.array([[1., 2.], [3., 4.]])
B = np.eye(2)
print(f”\n矩阵 A:\n{A}”)
print(f”矩阵 B (单位阵):\n{B}”)

矩阵乘法

print(f”\nA @ B:\n{A @ B}”)

矩阵的逆

A_inv = np.linalg.inv(A)
print(f”\nA 的逆:\n{A_inv}”)

验证 A * A_inv 是否为单位阵 (可能因浮点精度有微小误差)

print(f”\nA @ A_inv (验证):\n{A @ A_inv}”)

计算特征值和特征向量

eigenvalues, eigenvectors = np.linalg.eig(A)
print(f”\nA 的特征值: {eigenvalues}”)
print(f”A 的特征向量:\n{eigenvectors}”)
“`

3.2 随机数生成 (numpy.random)

用于生成各种概率分布的随机数。NumPy 的随机数生成经历了从旧式 np.random.* 函数到推荐使用新的 Generator API 的转变,后者提供更好的性能和统计特性。

旧式 API (仍然广泛使用):

  • np.random.rand(d0, d1, ..., dn): 生成 [0, 1) 之间均匀分布的随机数。
  • np.random.randn(d0, d1, ..., dn): 生成标准正态分布(均值为0,方差为1)的随机数。
  • np.random.randint(low, high=None, size=None, dtype=int): 生成指定范围内的随机整数。
  • np.random.choice(a, size=None, replace=True, p=None): 从给定数组 a 中随机抽样。p 指定每个元素的抽取概率。
  • np.random.shuffle(x): 原地打乱数组 x 的元素顺序。
  • np.random.permutation(x): 返回一个打乱顺序后的数组副本,不修改原数组。
  • np.random.seed(seed): 设置全局随机数种子(旧式方法,不推荐用于并行或库开发)。

新式 Generator API (推荐):

“`python

1. 创建一个 Generator 实例 (推荐方式)

rng = np.random.default_rng(seed=42) # seed 可选,用于复现

2. 使用 Generator 的方法生成随机数

print(f”\n使用 Generator API:”)

生成均匀分布 [0, 1)

print(f”均匀分布 (3×2):\n{rng.random((3, 2))}”)

生成标准正态分布

print(f”标准正态分布 (3,): {rng.standard_normal(3)}”)

生成随机整数 [0, 10)

print(f”随机整数 [0, 10): {rng.integers(0, 10, size=5)}”)

从数组中抽样

arr_to_sample = np.arange(10)
print(f”不重复抽样 3 个: {rng.choice(arr_to_sample, size=3, replace=False)}”)

原地打乱

rng.shuffle(arr_to_sample)
print(f”打乱后: {arr_to_sample}”)
“`

使用 Generator API 可以更好地隔离随机状态,避免全局状态带来的问题。

3.3 文件 I/O

NumPy 可以方便地将数组保存到磁盘以及从磁盘加载数组。

  • np.save(file, arr): 将单个数组以 NumPy 二进制格式 (.npy) 保存。
  • np.load(file): 从 .npy.npz 文件加载数组。
  • np.savez(file, name1=arr1, name2=arr2, ...): 将多个数组保存到一个未压缩的 .npz 文件中,通过关键字参数指定数组名称。
  • np.savez_compressed(file, name1=arr1, ...): 将多个数组保存到一个压缩的 .npz 文件中。
  • np.savetxt(fname, X, fmt='%.18e', delimiter=' ', ...): 将数组以纯文本格式保存。可以指定格式 (fmt) 和分隔符 (delimiter)。通常用于保存二维数组。
  • np.loadtxt(fname, dtype=float, delimiter=None, skiprows=0, ...): 从纯文本文件加载数据。功能相对简单。

示例:

“`python
arr_to_save = np.arange(12).reshape(3, 4)
print(f”\n待保存数组:\n{arr_to_save}”)

保存为 .npy 文件

np.save(‘my_array.npy’, arr_to_save)

加载 .npy 文件

loaded_arr = np.load(‘my_array.npy’)
print(f”从 .npy 加载的数组:\n{loaded_arr}”)

保存多个数组到 .npz

arr1 = np.array([1, 2, 3])
arr2 = np.array([[4, 5], [6, 7]])
np.savez(‘my_archive.npz’, first=arr1, second=arr2)

加载 .npz 文件

archive = np.load(‘my_archive.npz’)
print(f”\n从 .npz 加载:”)
print(f”数组 ‘first’: {archive[‘first’]}”)
print(f”数组 ‘second’:\n{archive[‘second’]}”)
archive.close() # 及时关闭文件

保存为文本文件

np.savetxt(‘my_array.txt’, arr_to_save, fmt=’%d’, delimiter=’,’)

从文本文件加载

loaded_txt = np.loadtxt(‘my_array.txt’, dtype=int, delimiter=’,’)
print(f”\n从 .txt 加载的数组:\n{loaded_txt}”)

清理示例文件 (可选)

import os
if os.path.exists(‘my_array.npy’): os.remove(‘my_array.npy’)
if os.path.exists(‘my_archive.npz’): os.remove(‘my_archive.npz’)
if os.path.exists(‘my_array.txt’): os.remove(‘my_array.txt’)
“`

3.4 数组操作与变形

NumPy 提供了丰富的函数来改变数组的形状、组合或拆分数组。

  • arr.reshape(new_shape): 返回一个具有新形状的数组视图(如果可能),否则返回副本。总元素数量必须保持不变。
  • arr.resize(new_shape): 原地修改数组形状。如果新形状需要更多元素,会用 0 填充;如果需要更少,会截断。
  • arr.ravel(): 返回一个展平(变为一维)的数组视图(如果可能)。
  • arr.flatten(): 返回一个展平(变为一维)的数组副本
  • arr.Tarr.transpose(*axes): 返回数组的转置视图。可以指定轴的顺序。
  • np.concatenate((arr1, arr2, ...), axis=0): 沿指定轴连接多个数组。
  • np.vstack((arr1, arr2)) (Vertical stack): 垂直(按行)堆叠数组,等效于 concatenate axis=0。
  • np.hstack((arr1, arr2)) (Horizontal stack): 水平(按列)堆叠数组,等效于 concatenate axis=1。
  • np.split(arr, indices_or_sections, axis=0): 沿指定轴将数组拆分为多个子数组。
  • np.hsplit(arr, indices_or_sections): 水平(按列)拆分数组。
  • np.vsplit(arr, indices_or_sections): 垂直(按行)拆分数组。
  • np.tile(arr, reps): 重复数组 arr 指定的次数 (reps) 来构造一个新数组。
  • np.repeat(arr, repeats, axis=None): 沿指定轴重复数组 arr 的每个元素。

示例:

“`python
a = np.arange(6).reshape((2, 3))
b = np.arange(6, 12).reshape((2, 3))
print(f”\n数组 a:\n{a}”)
print(f”数组 b:\n{b}”)

Reshape (视图)

reshaped_a = a.reshape(3, 2)
print(f”\na reshape (3, 2):\n{reshaped_a}”)

Flatten (副本)

flat_a = a.flatten()
print(f”a flatten: {flat_a}”)

转置 (视图)

print(f”\na 的转置:\n{a.T}”)

垂直堆叠

v_stacked = np.vstack((a, b))
print(f”\n垂直堆叠 vstack:\n{v_stacked}”) # shape (4, 3)

水平堆叠

h_stacked = np.hstack((a, b))
print(f”\n水平堆叠 hstack:\n{h_stacked}”) # shape (2, 6)

拆分

arr_split = np.arange(9)
print(f”\n待拆分数组: {arr_split}”)
split1, split2, split3 = np.split(arr_split, 3)
print(f”拆分为 3 部分: {split1}, {split2}, {split3}”)

重复 tile

arr_tile = np.array([[1, 2], [3, 4]])
tiled = np.tile(arr_tile, (2, 3)) # 垂直重复 2 次,水平重复 3 次
print(f”\ntile (2, 3):\n{tiled}”)
“`

四、 学习资源与建议

  • 官方文档: 始终是最终、最权威的参考。除了教程,API 参考部分极其详尽。https://numpy.org/doc/stable/
  • NumPy 用户指南: 官方文档中的用户指南部分提供了更结构化的学习路径。https://numpy.org/doc/stable/user/index.html
  • NumPy 绝对基础教程: 官方为初学者准备的教程。https://numpy.org/doc/stable/user/absolute_beginners.html
  • 动手实践: 在 Jupyter Notebook 或 IPython 环境中边学边练是最高效的方式。尝试解决一些小问题,比如:
    • 创建一个指定模式的数组。
    • 选取数组中满足特定条件的元素。
    • 实现一个简单的图像滤镜(图像可以用 NumPy 数组表示)。
    • 执行一些基本的线性代数运算。
  • 结合生态: 将 NumPy 与 Pandas(数据处理)、Matplotlib/Seaborn(可视化)、SciPy(科学计算扩展)结合使用,更能体会其威力。

五、 总结

NumPy 是 Python 数据科学领域不可动摇的基石。掌握其核心概念和常用操作对于任何希望利用 Python 进行数值计算、数据分析或机器学习的人来说都至关重要。本文通过中文解读和实例,精粹了 NumPy 官方文档的关键内容:

  1. ndarray 对象: 多维、同质、固定大小的数组是 NumPy 的核心。
  2. dtype: 精确控制数据类型对性能和内存至关重要。
  3. 数组创建: 灵活多样的初始化方法。
  4. 索引与切片: 强大的数据访问机制,区分视图与副本。
  5. 向量化运算与 ufuncs: 无需循环即可对整个数组进行高效计算。
  6. 广播: 处理不同形状数组运算的优雅规则。
  7. 聚合函数: 快速进行统计计算。
  8. 核心模块: linalg (线性代数), random (随机数), 文件 I/O, 数组变形等。

理解并熟练运用这些知识点,将使你能够编写出更简洁、更高效、功能更强大的 Python 数值计算代码。虽然官方文档内容庞杂,但抓住这些核心脉络,持续实践,你就能逐步精通 NumPy,并将其作为探索更广阔数据世界的利器。

“`

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部