【Python】NumPy高性能科学计算库简介与实用指南
文章目录
以下是关于
numpy 库的全面详细介绍,涵盖其核心功能、底层机制、高级用法及实际应用场景。
1. 简介
numpy(Numerical Python)是 Python 生态中用于高性能科学计算的基础库,其核心是 多维数组对象(ndarray),支持矢量化运算、广播机制和底层 C 优化。它广泛应用于数据科学、机器学习、信号处理等领域,是 pandas、scikit-learn、TensorFlow 等库的底层依赖。
numpy 是 Python 中用于科学计算的核心库之一,专为高效处理多维数组和矩阵运算设计。它在数据科学、机器学习、工程计算等领域广泛应用。以下是其核心特性和常见用法:
1.1性能优势
1.2应用场景
- 数据预处理:清洗、归一化、特征工程。
- 数值计算:解方程、傅里叶变换、线性代数。
- 图像处理:像素矩阵操作(如
OpenCV底层依赖numpy)。 - 机器学习:
scikit-learn、TensorFlow等库的底层支持。
1.3与 Python 列表的区别
| 特性 | numpy 数组 | Python 列表 |
|---|---|---|
| 元素类型 | 必须相同 | 可以不同 |
| 内存占用 | 紧凑,连续内存 | 分散,存储对象引用 |
| 运算速度 | 快(C 优化) | 慢(解释型循环) |
| 功能 | 丰富的数学函数和操作 | 基础操作 |
2. 核心特性
2.1 ndarray 多维数组
int32、float64),通过 dtype 参数指定。shape 属性描述数组的维度(如 (3, 4) 表示 3 行 4 列)。示例:
import numpy as np
# 创建 2x3 数组,指定数据类型为 float32
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)
print(arr.shape) # (2, 3)
print(arr.dtype) # float32
2.2 矢量化运算
+, -, *, /, ** 等)和逻辑运算符(>, == 等)。示例:
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(a > 1) # [False True True]
2.3 广播(Broadcasting)
允许不同形状的数组进行算术运算,规则如下:
- 从最右侧维度开始对齐,维度大小相等或其中一个为 1。
- 缺失的维度自动补 1。
示例:
# 3x3 矩阵 + 1x3 行向量 → 自动广播为 3x3
matrix = np.ones((3, 3))
row = np.array([1, 2, 3])
result = matrix + row # 等价于 matrix + row.reshape(1, 3)
2.4 通用函数(ufunc)
np.sin(), np.exp(), np.log()。np.frompyfunc() 将 Python 函数转换为 ufunc。示例:
arr = np.array([0, np.pi/2, np.pi])
print(np.sin(arr)) # [0. 1. 0.]
3. 数组操作
3.1 索引与切片
示例:
arr = np.arange(12).reshape(3, 4)
# 基础切片
print(arr[1, :]) # 第2行:[4 5 6 7]
print(arr[:, 1::2]) # 所有行,第2列开始,每隔一列取一列
# 布尔索引
mask = arr > 5
print(arr[mask]) # [6, 7, 8, 9, 10, 11]
# 花式索引
print(arr[[0, 2], [1, 3]]) # 取(0,1)和(2,3)位置的元素 → [1, 11]
3.2 形状操作
reshape(), resize(), flatten()。T, transpose(), swapaxes()。np.concatenate(), np.split(), np.vstack()/np.hstack()。示例:
a = np.array([[1, 2], [3, 4]])
# 转置
print(a.T) # [[1 3], [2 4]]
# 调整形状为 4x1
b = a.reshape(4, 1)
# 垂直堆叠
c = np.vstack([a, [[5, 6]]]) # 3x2 矩阵
3.3 聚合计算
sum(), mean(), std(), min(), max()。axis 参数控制计算方向(如 axis=0 按列计算)。示例:
arr = np.array([[1, 2], [3, 4]])
print(np.sum(arr)) # 10(全局求和)
print(np.mean(arr, axis=0)) # [2. 3.](按列求均值)
4. 高级功能
4.1 线性代数
@ 或 np.dot()。np.linalg.inv(), np.linalg.svd()。np.linalg.det(), np.linalg.eig()。示例:
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(A @ B) # [[19 22], [43 50]]
# 求逆矩阵
inv_A = np.linalg.inv(A)
4.2 内存布局与性能优化
order 参数控制。示例:
# 创建 C 顺序数组(默认)
arr_c = np.array([[1, 2], [3, 4]], order='C')
# 创建 Fortran 顺序数组
arr_f = np.array([[1, 2], [3, 4]], order='F')
4.3 结构化数组
支持类似表格的异构数据类型(类似 pandas 的 DataFrame)。
示例:
# 定义结构化数据类型
dtype = [('name', 'S10'), ('age', 'i4'), ('score', 'f4')]
data = np.array([('Alice', 25, 89.5), ('Bob', 30, 92.0)], dtype=dtype)
# 按字段访问
print(data['name']) # [b'Alice' b'Bob']
5. 性能对比
5.1 numpy vs 纯 Python
import time
# 纯 Python 列表求和
py_list = list(range(1_000_000))
start = time.time()
sum(py_list)
print("Python time:", time.time() - start) # ~0.05s
# numpy 数组求和
np_arr = np.arange(1_000_000)
start = time.time()
np.sum(np_arr)
print("Numpy time:", time.time() - start) # ~0.0005s
6. 与其他库的集成
pandas:DataFrame 和 Series 底层使用 numpy 数组。matplotlib:直接绘制 numpy 数组数据。scipy:基于 numpy 提供科学计算高级函数(如信号处理、优化算法)。7. 局限性
pandas)。8. 安装与文档
pip install numpy
掌握 numpy 后,可进一步学习 pandas(数据处理)和 scipy(科学计算),构建完整的数据分析工具链。
作者:晴雨日记