以下是关于
numpy
库的全面详细介绍,涵盖其核心功能、底层机制、高级用法及实际应用场景。
1. 简介
numpy
(Numerical Python)是 Python 生态中用于高性能科学计算的基础库,其核心是 多维数组对象(ndarray
),支持矢量化运算、广播机制和底层 C 优化。它广泛应用于数据科学、机器学习、信号处理等领域,是 pandas
、scikit-learn
、TensorFlow
等库的底层依赖。
numpy
是 Python 中用于科学计算的核心库之一,专为高效处理多维数组和矩阵运算设计。它在数据科学、机器学习、工程计算等领域广泛应用。以下是其核心特性和常见用法:
1.1性能优势
- 矢量化计算:用 C 语言实现底层循环,避免 Python 循环开销。
- 内存优化:连续内存存储,支持大规模数据高效处理。
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 矢量化运算
- 避免显式循环:直接对数组进行数学运算,底层由 C 实现循环,性能提升数十到数百倍。
- 支持所有算术运算符(
+
,-
,*
,/
,**
等)和逻辑运算符(>
,==
等)。
示例:
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()
。 - 自定义 ufunc:通过
np.frompyfunc()
将 Python 函数转换为 ufunc。
示例:
arr = np.array([0, np.pi/2, np.pi])
print(np.sin(arr)) # [0. 1. 0.]
3. 数组操作
3.1 索引与切片
- 基础索引:类似 Python 列表,但支持多维。
- 布尔索引:通过布尔数组筛选元素。
- 花式索引:用整数数组指定复杂索引。
示例:
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 内存布局与性能优化
- 视图(View)与拷贝(Copy):视图共享数据,拷贝创建新内存。
- 内存顺序:C 风格(行优先)或 Fortran 风格(列优先),通过
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.org/doc/stable
掌握 numpy
后,可进一步学习 pandas
(数据处理)和 scipy
(科学计算),构建完整的数据分析工具链。