Python中如何使用NumPy库 科学计算中的数组操作技巧

Python中如何使用NumPy库 科学计算中的数组操作技巧
最新回答
泼得千树泪

2022-01-06 06:11:26

NumPy是Python科学计算的核心库,通过ndarray对象实现高效数组操作。以下是关键技巧的总结:

1. 数组创建方法
  • np.array():从列表或元组创建数组,支持多维结构。import numpy as nparr = np.array([1, 2, 3]) # 一维数组arr_2d = np.array([[1, 2], [3, 4]]) # 二维数组
  • 预分配内存

    np.zeros((2, 3)):创建2行3列的全零数组。

    np.ones((2, 2)):创建全1数组。

    np.empty((3, 3)):创建未初始化的数组(值随机)。

  • 等差/等间隔数组

    np.arange(0, 10, 2):生成0到10(不含)步长为2的数组。

    np.linspace(0, 1, 5):生成0到1之间5个等间隔点。

  • 随机数组

    np.random.rand(2, 2):生成0到1均匀分布的随机数组。

    np.random.randn(2, 2):生成标准正态分布的随机数组。

2. 索引与切片

  • 基本索引

    一维:arr[0]获取第一个元素。

    多维:arr_2d[1, 0]获取第二行第一列元素。

  • 切片

    一维:arr[1:4]获取索引1到3的元素。

    多维:arr_2d[:, 1:3]获取所有行的第2到3列。

  • 布尔索引:arr = np.array([1, 2, 3, 4])mask = arr > 2print(arr[mask]) # 输出[3, 4]
  • 花式索引:arr = np.array([10, 20, 30, 40])print(arr[[0, 2]]) # 输出[10, 30]
3. 数组运算
  • 算术运算:直接对数组进行加减乘除等操作。a = np.array([1, 2, 3])b = np.array([4, 5, 6])print(a + b) # 输出[5, 7, 9]
  • 比较运算:返回布尔数组。print(a > 2) # 输出[False, False, True]
  • 逻辑运算:需使用&、|、~(避免与and/or混淆)。mask = (a > 1) & (a < 4)print(mask) # 输出[False, True, True]
  • 通用函数(ufunc):对每个元素应用数学函数。print(np.sin(a)) # 输出[0.8415, 0.9093, 0.1411]
4. 广播机制

广播机制允许不同形状的数组进行运算,规则如下:

  1. 维度对齐:维度数小的数组在前补1。
  2. 大小匹配:若某维度大小为1,则广播至另一数组的大小。
  3. 错误触发:若维度大小既不相等也不为1,则报错。

示例

a = np.array([[1, 2, 3], [4, 5, 6]]) # 形状(2, 3)b = np.array([10, 20, 30]) # 形状(3,)print(a + b) # 广播后形状(2, 3),输出[[11,22,33], [14,25,36]]5. 线性代数运算

通过numpy.linalg模块实现:

  • 矩阵求逆:matrix = np.array([[1, 2], [3, 4]])inv_matrix = np.linalg.inv(matrix)
  • 行列式:det = np.linalg.det(matrix) # 输出-2.0
  • 特征值与特征向量:eigenvalues, eigenvectors = np.linalg.eig(matrix)
  • 解方程组:A = np.array([[3, 1], [1, 2]])b = np.array([9, 8])x = np.linalg.solve(A, b) # 解为[2., 3.]
  • 矩阵乘法:A = np.array([[1, 2], [3, 4]])B = np.array([[5, 6], [7, 8]])print(np.dot(A, B)) # 或使用A @ B
6. 性能优化技巧

  • 避免循环:优先使用向量化运算。
  • 选择数据类型:通过dtype指定合适类型(如float32减少内存占用)。
  • 利用广播:减少不必要的内存复制。
  • 使用内置函数:如np.sum()、np.mean()等优化过的函数。
  • 内存视图:通过切片操作避免数据复制。arr = np.array([1, 2, 3, 4])view = arr[1:3] # 内存视图,修改view会影响arr
常见问题解答
  • NumPy数组与Python列表的区别

    数组存储同类型数据,列表可存储不同类型。

    数组内存连续存储,运算速度更快。

    数组提供数学函数支持,列表无。

  • 形状(shape)与维度(ndim)

    shape表示各维度大小(如(3, 4)),ndim表示轴数(如2)。

  • 改变形状

    reshape((2, 6)):需保证元素总数不变。

    flatten():将多维数组展平为一维。

掌握这些技巧后,可高效处理数据分析、机器学习等任务中的数值计算问题。