Python 中 NumPy使用详解
·
1️、基础概念
-
NumPy(Numerical Python)是 Python 的数值计算核心库,提供高效的 多维数组(ndarray) 和 向量化运算。
-
核心对象:
import numpy as np a = np.array([1, 2, 3]) type(a) # <class 'numpy.ndarray'> -
ndarray 特点:
- n 维数组(1D、2D、3D…)
- 同类型元素(dtype)
- 高效的内存布局和向量化运算
2️、创建数组
2.1 由列表创建
import numpy as np
a = np.array([1,2,3]) # 一维
b = np.array([[1,2],[3,4]]) # 二维
2.2 内置函数创建
np.zeros((2,3)) # 全零
np.ones((2,3)) # 全一
np.eye(3) # 单位矩阵
np.arange(0,10,2) # 类似 range
np.linspace(0,1,5) # 等间隔数列
np.random.rand(2,3) # [0,1)随机数
np.random.randn(2,3) # 标准正态分布
np.random.randint(0,10,(2,3)) # 整数随机
2.3 特殊类型
np.empty((2,3)) # 未初始化的数组
np.full((2,3), 7) # 填充特定值
3️、数组属性
a = np.array([[1,2,3],[4,5,6]])
a.shape # (2,3)
a.size # 6
a.ndim # 2
a.dtype # dtype('int64')
a.itemsize # 每个元素占用字节数
a.nbytes # 总字节数 = size * itemsize
4️、索引与切片
4.1 基本索引
a[0,1] # 第0行第1列
a[1,:] # 第1行
a[:,2] # 第2列
4.2 布尔索引
mask = a > 3
a[mask] # array([4,5,6])
4.3 整数数组索引
rows = np.array([0,1])
cols = np.array([2,1])
a[rows,cols] # array([3,5])
4.4 切片与步长
a[:, ::2] # 每行取步长为2的列
5️、数组运算(向量化)
5.1 元素级运算
a = np.array([1,2,3])
b = np.array([4,5,6])
a + b
a - b
a * b # 元素乘
a / b
a ** 2 # 元素平方
5.2 常用函数
np.sum(a)
np.mean(a)
np.max(a)
np.min(a)
np.argmax(a)
np.argmin(a)
np.std(a)
np.var(a)
5.3 矩阵运算
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
A @ B # 矩阵乘法
A.dot(B) # 矩阵乘法
A.T # 转置
6️、广播机制
- 不同形状的数组运算时,NumPy 会自动扩展维度:
a = np.array([1,2,3]) # shape (3,)
b = np.array([[1],[2]]) # shape (2,1)
c = a + b
# b自动广播为 [[1,1,1],[2,2,2]]
7️、线性代数
A = np.array([[1,2],[3,4]])
B = np.array([[5,6],[7,8]])
np.linalg.inv(A) # 逆矩阵
np.linalg.det(A) # 行列式
np.linalg.eig(A) # 特征值、特征向量
np.linalg.solve(A,B)# 解线性方程 AX=B
np.linalg.norm(A) # 范数
8️、随机数模块
np.random.seed(42) # 设置随机种子
np.random.rand(3) # [0,1)均匀
np.random.randn(3) # 标准正态
np.random.randint(0,10,5) # 整数
np.random.choice([1,2,3],3) # 随机抽样
9️、排序与唯一值
a = np.array([3,1,2,3])
np.sort(a) # 排序
np.argsort(a) # 排序索引
np.unique(a) # 唯一值
10️、堆叠与拆分
a = np.array([1,2])
b = np.array([3,4])
np.vstack([a,b]) # 垂直堆叠
np.hstack([a,b]) # 水平堆叠
np.split(a,2) # 拆分
11️、高级索引技巧
- 条件修改:
a[a>2] = 0
- 广播+索引组合:
a[:, np.newaxis] + b
- 布尔矩阵索引:
mask = (A>2) & (A<4)
A[mask]
12️、性能优化
-
向量化:
- 尽量避免 Python 循环。
# 慢
for i in range(len(a)):
b[i] = a[i]*2
# 快
b = a*2
-
数据类型优化:
- 使用
dtype=np.float32而不是默认float64可节省内存。
- 使用
-
内存共享:
- 切片操作不会复制数据。
b = a[::2] # b 与 a 共享内存
-
np.einsum:
- 高性能张量操作,如批量矩阵乘法。
13️、文件 I/O
np.save("a.npy", a) # 保存
b = np.load("a.npy") # 读取
np.savetxt("a.txt", a) # 文本保存
c = np.loadtxt("a.txt") # 文本读取
14️、实用技巧
- reshape:
a.reshape(3,2)
- flatten / ravel:
a.flatten() # 复制
a.ravel() # 共享内存
- clip:
np.clip(a, 0, 5) # 限制范围
- where:
np.where(a>2, a, 0)
总结
NumPy 主要功能模块:
| 功能 | 说明 |
|---|---|
| ndarray | 多维数组,向量化计算 |
| 创建 | zeros, ones, arange, linspace, random |
| 索引切片 | 基本索引、布尔索引、整型索引 |
| 运算 | 元素级运算、矩阵运算、广播 |
| 线性代数 | inv, det, eig, solve, norm |
| 随机 | rand, randn, randint, choice |
| 排序/唯一 | sort, argsort, unique |
| 堆叠/拆分 | vstack, hstack, split |
| 文件 I/O | save, load, savetxt, loadtxt |
| 性能优化 | 向量化、dtype优化、共享内存、einsum |
更多推荐

所有评论(0)