NumPy 详解
NumPy 详解
NumPy(Numerical Python)是 Python 科学计算的核心库,提供高性能的多维数组对象和计算工具。它是 Pandas、SciPy、Matplotlib 等库的基础。
1. 核心:ndarray 数组
NumPy 的核心是 ndarray
(N-dimensional array)对象:
- 同质数据:所有元素类型相同
- 高效存储:连续内存块存储
- 向量化操作:避免显式循环
创建数组:
import numpy as np# 从列表创建
arr = np.array([1, 2, 3, 4]) # 特殊数组
zeros = np.zeros((3, 4)) # 3x4全0数组
ones = np.ones((2, 3)) # 2x3全1数组
empty = np.empty((2, 2)) # 未初始化数组
arange = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
linspace = np.linspace(0, 1, 5) # [0., 0.25, 0.5, 0.75, 1.]
2. 数组属性
arr = np.array([[1, 2, 3], [4, 5, 6]])print(arr.ndim) # 维度数: 2
print(arr.shape) # 形状: (2, 3)
print(arr.size) # 元素总数: 6
print(arr.dtype) # 元素类型: int64
print(arr.itemsize) # 元素字节大小: 8
3. 数组索引与切片
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 基本索引
print(arr[0, 1]) # 2# 切片
print(arr[:2, 1:]) # [[2,3],[5,6]]# 布尔索引
mask = arr > 4
print(arr[mask]) # [5,6,7,8,9]# 花式索引
print(arr[[0, 2]]) # [[1,2,3],[7,8,9]]
4. 数组操作
形状操作:
arr = np.arange(6).reshape(2, 3) # 改变形状
flat = arr.flatten() # 展平为一维
数组运算:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])print(a + b) # [5,7,9]
print(a * 2) # [2,4,6]
print(np.dot(a, b)) # 点积: 32
广播机制(不同形状数组运算):
a = np.array([[1,2], [3,4]])
b = np.array([10, 20])print(a + b) # [[11,22],[13,24]]
5. 数学函数
arr = np.array([1.0, 4.0, 9.0])print(np.sqrt(arr)) # [1., 2., 3.]
print(np.exp(arr)) # 指数计算
print(np.sin(arr)) # 三角函数
print(np.log(arr)) # 自然对数
6. 统计函数
arr = np.arange(12).reshape(3,4)print(np.sum(arr)) # 总和: 66
print(np.mean(arr, axis=0)) # 列均值: [4,5,6,7]
print(np.max(arr, axis=1)) # 行最大值: [3,7,11]
print(np.std(arr)) # 标准差
7. 数组操作函数
拼接:
a = np.array([[1,2], [3,4]])
b = np.array([[5,6]])# 垂直拼接
c = np.vstack((a, b)) # [[1,2],[3,4],[5,6]]
# 水平拼接
d = np.hstack((a, b.T)) # [[1,2,5],[3,4,6]]
分割:
arr = np.arange(9).reshape(3,3)
result = np.hsplit(arr, 3) # 水平分割成3份
转置:
arr = np.arange(6).reshape(2,3)
print(arr.T) # [[0,3],[1,4],[2,5]]
8. 线性代数
A = np.array([[1,2], [3,4]])
B = np.array([[5,6], [7,8]])# 矩阵乘法
print(np.dot(A, B)) # 或 A @ B# 求逆矩阵
inv_A = np.linalg.inv(A)# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
9. 随机数生成
# 均匀分布
np.random.rand(2,3) # [0,1)区间
np.random.uniform(0,10) # [0,10)区间# 正态分布
np.random.randn(2,3) # 标准正态
np.random.normal(0,1,10)# 均值为0,标准差为1# 随机整数
np.random.randint(0, 10, size=5) # [0,10)的5个整数# 随机种子(重现结果)
np.random.seed(42)
10. 文件操作
# 保存为二进制文件
np.save('data.npy', arr)
loaded_arr = np.load('data.npy')# 文本文件
np.savetxt('data.txt', arr, delimiter=',')
arr_from_txt = np.loadtxt('data.txt', delimiter=',')
性能优势
- 向量化操作:避免Python循环
- 内存连续:高效缓存利用
- 底层优化:使用C/C++/Fortran实现
- 并行计算:支持SIMD指令
# 向量化 vs 循环 性能对比
import timearr = np.random.rand(1000000)# 向量化操作
start = time.time()
result = np.sin(arr)
print(f"向量化耗时: {time.time()-start:.6f}s")# Python循环
start = time.time()
result = [np.sin(x) for x in arr]
print(f"循环耗时: {time.time()-start:.6f}s")
应用场景
- 数值计算(微积分、线性代数)
- 数据处理与清洗
- 图像处理(像素数组)
- 机器学习(数据预处理)
- 科学模拟(物理、生物等领域)
NumPy 是 Python 科学计算生态系统的基石,掌握它将大幅提升数据处理和科学计算能力!