Numpy

一、核心概念:NumPy 数组(ndarray)

NumPy 的核心是 ndarray(N 维数组),与 Python 原生列表相比,具有以下优势:

  • 同类型数据:所有元素类型必须一致(如全为 intfloat),避免类型检查开销。
  • 高效内存:连续存储,支持向量化操作,速度远快于列表。
  • 多维支持:轻松处理一维、二维甚至更高维数据(如矩阵、张量)。

示例:创建数组

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np

# 一维数组
arr1d = np.array([1, 2, 3])

# 二维数组(矩阵)
arr2d = np.array([[1, 2], [3, 4]])

# 特殊数组
zeros = np.zeros((2, 3)) # 2x3 全零矩阵
ones = np.ones((3,)) # 长度为3的一维全1数组
range_arr = np.arange(10) # 类似range(10),但返回数组
linspace = np.linspace(0, 1, 5) # 在0到1间生成5个等间隔数

二、关键操作:数组运算与索引

1. 向量化运算

NumPy 支持数组间的直接运算(无需循环),大幅提升效率。

1
2
3
4
5
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(a + b) # 输出 [5, 7, 9](逐元素相加)
print(a * 2) # 输出 [2, 4, 6](广播机制)

2. 索引与切片

支持类似列表的切片,但扩展到多维:

1
2
3
4
5
arr = np.array([[1, 2, 3], [4, 5, 6]])

print(arr[0, 1]) # 输出 2(第一行第二列)
print(arr[:, 1]) # 输出 [2, 5](所有行的第二列)
print(arr[1, :2]) # 输出 [4, 5](第二行的前两列)

3. 布尔索引

通过条件筛选数据:

1
2
3
a = np.array([1, 2, 3, 4])
mask = a > 2 # 生成布尔数组 [False, False, True, True]
print(a[mask]) # 输出 [3, 4]

三、常用函数:统计与线性代数

1. 统计函数

1
2
3
4
5
arr = np.array([1, 2, 3, 4])
print(np.sum(arr)) # 输出 10
print(np.mean(arr)) # 输出 2.5
print(np.max(arr)) # 输出 4
print(np.argmax(arr)) # 输出 3(最大值的索引)

2. 线性代数

1
2
3
4
5
from numpy.linalg import inv, det

A = np.array([[1, 2], [3, 4]])
print(inv(A)) # 矩阵求逆
print(det(A)) # 矩阵行列式

四、广播机制(Broadcasting)

NumPy 允许不同形状的数组进行运算,自动扩展较小数组以匹配较大数组的形状。

1
2
3
4
5
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20]) # 一维数组

print(a + b) # 输出 [[11, 22], [13, 24]]
# 广播规则:b 被扩展为 [[10, 20], [10, 20]],再与 a 相加

五、快速上手实践建议

  1. 动手练习:通过 NumPy 官方教程 或在线练习平台(如 Kaggle)巩固。
  2. 对比列表:尝试用 NumPy 和原生列表实现相同操作,感受性能差异。
  3. 结合实际:用 NumPy 处理 CSV 数据、图像像素等真实场景。

六、常见问题解答

  • Q:NumPy 数组 vs Python 列表?
    • A:数组适合数值计算,列表适合异构数据存储。
  • Q:如何将数组转为列表?
    • A:使用 arr.tolist()
  • Q:如何保存/加载数组?
    • A:np.save('file.npy', arr) 保存,np.load('file.npy') 加载。