NumPy(Numerical Python)是 Python 中用于科学计算的核心库,其核心是 多维数组对象 ndarray
。它通过高效的内存管理和矢量化运算,大幅提升了数值计算的速度。
核心原理
ndarray
对象- 存储同类型数据的多维数组,内存连续分配,支持高效访问。
- 相比 Python 列表,避免了类型检查和循环开销,计算速度提升 10-100 倍。
- 矢量化操作
- 使用预编译的 C 代码对数组整体操作(如
a + b
),避免显式循环。 - 支持广播机制,允许不同形状数组进行运算(如标量与数组相加)。
- 使用预编译的 C 代码对数组整体操作(如
- 内存优化
- 数据在内存中连续存储,支持 CPU 缓存友好访问。
- 提供多种数据类型(如
int32
,float64
),精确控制内存占用。
基础用法
import numpy as np
# 1. 创建数组
a = np.array([1, 2, 3]) # 一维数组
b = np.array([[1, 2], [3, 4]]) # 二维数组
c = np.zeros((3, 3)) # 全0数组
d = np.arange(0, 10, 2) # 类似 range: [0 2 4 6 8]
# 2. 数组属性
print(a.shape) # (3,) → 形状
print(b.dtype) # int64 → 数据类型
print(b.ndim) # 2 → 维度数
# 3. 索引与切片
print(b[1, 0]) # 3 → 第二行第一列
print(b[:, 1]) # [2, 4] → 所有行的第二列
# 4. 形状操作
e = np.array([[1, 2], [3, 4], [5, 6]])
f = e.reshape(2, 3) # 改为 2x3 形状
g = e.flatten() # 展平为一维数组 → [1 2 3 4 5 6]
数学与统计操作
# 1. 基本运算
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. 矩阵乘法
matrix_a = np.array([[1, 2], [3, 4]])
matrix_b = np.array([[5, 6], [7, 8]])
print(np.dot(matrix_a, matrix_b)) # [[19 22], [43 50]]
# 3. 统计函数
data = np.array([1, 2, 3, 4, 5])
print(np.mean(data)) # 3.0 → 均值
print(np.max(data)) # 5 → 最大值
print(np.std(data)) # 1.414 → 标准差
# 4. 随机数生成
random_arr = np.random.rand(3, 2) # 生成 3x2 的随机数组(0-1之间)
广播机制示例
a = np.array([[1, 2], [3, 4]])
b = np.array([10, 20])
print(a + b) # [[11 22], [13 24]] → b 被广播为 [[10,20], [10,20]]
实际应用场景
示例1:数据归一化
data = np.random.randint(0, 100, size=(5, 5))
normalized = (data - np.min(data)) / (np.max(data) - np.min(data))
示例2:图像处理(RGB转灰度)
# 假设 image 是形状为 (height, width, 3) 的 RGB 图像数组
gray_image = np.dot(image, [0.299, 0.587, 0.114])
性能优化技巧
- 避免循环:尽量使用矢量化操作(如
np.sum()
替代for
循环求和)。 - 视图与拷贝:切片返回视图(不复制数据),
copy()
方法显式复制。 - 内存预分配:提前用
np.empty()
或np.zeros()
分配数组。
总结
NumPy 的核心是通过 ndarray
实现高效数值计算,适用于大规模数据处理、矩阵运算和科学计算。掌握其广播机制、矢量化操作和常用函数(如 reshape
, dot
, mean
)是高效使用 NumPy 的关键。