Numpy
2025年11月6日大约 7 分钟
Numpy
NumPy 常见方法的完整梳理,按“数据创建、属性查看、形状操作、索引与切片、数值计算、广播机制、IO操作、高级功能”八大模块分类,涵盖基础到进阶用法,附具体示例和说明:
一、数据创建(构建ndarray数组)
NumPy的核心是ndarray(N-dimensional array),以下是创建数组的常用方法:
| 方法 | 功能描述 | 示例代码 | 输出结果(简化) |
|---|---|---|---|
np.array() | 从列表/元组创建数组,可指定数据类型dtype | np.array([1,2,3], dtype=float) | array([1., 2., 3.]) |
np.zeros() | 创建全0数组,需指定形状shape | np.zeros((2,3), dtype=int) | array([[0, 0, 0], [0, 0, 0]]) |
np.ones() | 创建全1数组 | np.ones(5) | array([1., 1., 1., 1., 1.]) |
np.full() | 创建指定值的数组 | np.full((2,2), 8) | array([[8, 8], [8, 8]]) |
np.arange() | 生成连续整数数组(类似range) | np.arange(1, 10, 2) # 起始=1,终止=10(不含),步长=2 | array([1, 3, 5, 7, 9]) |
np.linspace() | 生成等间隔浮点数数组 | np.linspace(0, 1, 5) # 0到1之间取5个点 | array([0. , 0.25, 0.5 , 0.75, 1. ]) |
np.eye() | 创建单位矩阵(对角线为1,其余为0) | np.eye(3) # 3x3单位矩阵 | array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) |
np.random.rand() | 生成[0,1)均匀分布的随机数组 | np.random.rand(2,2) # 2x2随机数组 | 随机值(如[[0.1, 0.2], [0.3, 0.4]]) |
np.random.randn() | 生成标准正态分布(均值0,方差1)随机数组 | np.random.randn(3) | 随机值(如[-0.5, 1.2, -0.3]) |
np.random.randint() | 生成指定范围的整数随机数组 | np.random.randint(1, 10, size=(2,3)) # 1-10(不含10)的2x3数组 | 随机整数(如[[3,5,2], [7,1,8]]) |
二、数组属性查看(了解ndarray的基本信息)
通过属性快速获取数组的维度、形状、数据类型等:
| 属性/方法 | 功能描述 | 示例(基于arr = np.array([[1,2,3], [4,5,6]])) | 结果 |
|---|---|---|---|
ndim | 数组的维度(秩) | arr.ndim | 2(二维) |
shape | 数组的形状(各维度大小) | arr.shape | (2, 3) |
size | 数组的总元素个数 | arr.size | 6 |
dtype | 数组的数据类型(如int32、float64) | arr.dtype | int64 |
itemsize | 每个元素的字节大小 | arr.itemsize | 8(64位int) |
nbytes | 数组的总字节大小(size * itemsize) | arr.nbytes | 48(6*8) |
astype() | 转换数组的数据类型(返回新数组) | arr.astype(float) | 元素转为float型 |
三、形状操作(调整数组的维度和结构)
通过方法改变数组的形状,或合并/拆分数组:
| 方法 | 功能描述 | 示例(基于arr = np.arange(6) → [0,1,2,3,4,5]) | 输出结果(简化) |
|---|---|---|---|
reshape() | 重塑数组形状(元素总数不变) | arr.reshape(2,3) | [[0,1,2], [3,4,5]] |
flatten() | 数组扁平化(转为1维数组,返回副本) | arr.reshape(2,3).flatten() | [0,1,2,3,4,5] |
ravel() | 数组扁平化(返回视图,修改会影响原数组) | arr_2d = arr.reshape(2,3); arr_2d.ravel() | [0,1,2,3,4,5] |
transpose() / T | 数组转置(行列互换,适用于2维及以上) | arr.reshape(2,3).T 或 .transpose() | [[0,3], [1,4], [2,5]] |
expand_dims() | 增加维度(指定轴axis) | np.expand_dims(arr, axis=0) | [[0,1,2,3,4,5]](从1维→2维,shape=(1,6)) |
squeeze() | 移除长度为1的维度 | np.squeeze(np.array([[0,1,2]])) | [0,1,2](从2维→1维) |
concatenate() | 沿指定轴拼接多个数组(维度需匹配) | a = np.array([1,2]); b = np.array([3,4]); np.concatenate([a,b], axis=0) | [1,2,3,4] |
vstack() | 垂直拼接(按行,等价于concatenate(axis=0)) | a = np.array([[1,2]]); b = np.array([[3,4]]); np.vstack([a,b]) | [[1,2], [3,4]] |
hstack() | 水平拼接(按列,等价于concatenate(axis=1)) | a = np.array([[1], [2]]); b = np.array([[3], [4]]); np.hstack([a,b]) | [[1,3], [2,4]] |
split() | 沿指定轴拆分数组 | np.split(np.arange(6), 3) # 拆分为3个等长数组 | [array([0,1]), array([2,3]), array([4,5])] |
四、索引与切片(获取数组中的元素)
NumPy的索引和切片支持多维操作,语法类似列表但更灵活:
| 操作类型 | 示例(基于arr = np.arange(12).reshape(3,4) → [[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) | 输出结果 |
|---|---|---|
| 1. 基础索引(单元素) | arr[1, 2] # 第2行(索引1)第3列(索引2) | 6 |
| 2. 切片(范围元素) | - 取第2行所有元素:arr[1, :] - 取所有行的第3列: arr[:, 2] - 取前2行的前3列: arr[:2, :3] | [4,5,6,7];[2,6,10];[[0,1,2],[4,5,6]] |
| 3. 步长切片 | 取所有行,列每隔1取1个(从0开始):arr[:, ::2] | [[ 0, 2], [ 4, 6], [ 8, 10]] |
| 4. 布尔索引(条件筛选) | 取所有大于5的元素:arr[arr > 5] | [ 6, 7, 8, 9, 10, 11] |
| 5. 整数数组索引(指定位置) | 取第0行和第2行,第1列和第3列:arr[[0,2], [1,3]] | [1, 11] |
五、数值计算(数组的算术与统计运算)
NumPy支持向量化运算(无需循环,直接对数组整体操作),效率极高:
1. 基础算术运算(element-wise,元素级)
| 运算 | 方法/运算符 | 示例(a = np.array([1,2,3]); b = np.array([4,5,6])) | 结果 |
|---|---|---|---|
| 加法 | + 或 np.add() | a + b 或 np.add(a,b) | [5,7,9] |
| 减法 | - 或 np.subtract() | b - a 或 np.subtract(b,a) | [3,3,3] |
| 乘法 | * 或 np.multiply() | a * b 或 np.multiply(a,b) | [4,10,18] |
| 除法 | / 或 np.divide() | b / a 或 np.divide(b,a) | [4. , 2.5, 2.] |
| 幂运算 | ** 或 np.power() | a** 2 或 np.power(a,2) | [1,4,9] |
| 取余 | % 或 np.mod() | b % a 或 np.mod(b,a) | [0,1,0] |
2. 矩阵运算(线性代数)
| 运算 | 方法 | 示例(a = np.array([[1,2],[3,4]]); b = np.array([[5,6],[7,8]])) | 结果 |
|---|---|---|---|
| 矩阵乘法 | np.dot() 或 @ | np.dot(a,b) 或 a @ b | [[19, 22], [43, 50]] |
| 矩阵行列式 | np.linalg.det() | np.linalg.det(a) | -2.0(2x2矩阵行列式) |
| 矩阵逆(可逆时) | np.linalg.inv() | np.linalg.inv(a) | [[-2. , 1. ], [ 1.5, -0.5]] |
| 矩阵转置 | T 或 np.transpose() | a.T | [[1,3], [2,4]] |
3. 统计运算(按轴或全局计算)
| 运算 | 方法 | 示例(arr = np.array([[1,2,3],[4,5,6]])) | 结果(全局/按行axis=1/按列axis=0) |
|---|---|---|---|
| 求和 | np.sum() | np.sum(arr);np.sum(arr, axis=1) | 21;[6, 15] |
| 均值 | np.mean() | np.mean(arr);np.mean(arr, axis=0) | 3.5;[2.5, 3.5, 4.5] |
| 标准差 | np.std() | np.std(arr) | 1.707...(全局标准差) |
| 方差 | np.var() | np.var(arr) | 2.916...(全局方差) |
| 最大值 | np.max() | np.max(arr, axis=1) | [3,6](每行最大值) |
| 最小值 | np.min() | np.min(arr, axis=0) | [1,2,3](每列最小值) |
| 最大值索引 | np.argmax() | np.argmax(arr, axis=0) | [1,1,1](每列最大值所在行索引) |
| 最小值索引 | np.argmin() | np.argmin(arr, axis=1) | [0,0](每行最小值所在列索引) |
| 累加(前缀和) | np.cumsum() | np.cumsum(arr.flatten()) | [1,3,6,10,15,21](1维累加) |
六、广播机制(不同形状数组的运算)
当两个数组形状不同时,NumPy会自动扩展维度使其兼容(满足广播规则),无需手动对齐:
- 广播规则:两个数组的维度从后往前对比,若维度相等或其中一个为1,则可广播。
- 示例:
a = np.array([[1, 2, 3], [4, 5, 6]]) # shape=(2,3) b = np.array([10, 20, 30]) # shape=(3,) → 广播为(2,3) print(a + b) # 等价于 a + [[10,20,30], [10,20,30]] # 输出:[[11, 22, 33], [14, 25, 36]]
七、IO操作(数组的保存与加载)
NumPy支持高效存储数组(二进制格式,保留形状和数据类型):
| 方法 | 功能描述 | 示例代码 |
|---|---|---|
np.save() | 保存单个数组为.npy文件(二进制) | np.save('my_array.npy', arr) |
np.load() | 加载.npy文件 | loaded_arr = np.load('my_array.npy') |
np.savez() | 保存多个数组为.npz压缩文件 | np.savez('arrays.npz', a=arr1, b=arr2) # 以键值对形式存储 |
np.loadtxt() | 从文本文件(如CSV)加载数组(纯数值) | np.loadtxt('data.csv', delimiter=',') # 按逗号分隔 |
np.savetxt() | 将数组保存为文本文件 | np.savetxt('output.csv', arr, delimiter=',') |
八、高级功能(适合进阶场景)
| 方法/函数 | 功能描述 | 示例场景 |
|---|---|---|
np.where() | 按条件返回元素索引或替换元素 | np.where(arr > 5, 1, 0) # 大于5的元素设为1,否则为0 |
np.unique() | 去除重复元素并排序 | np.unique([1,2,2,3,3,3]) → [1,2,3] |
np.isnan() | 判断元素是否为NaN(缺失值) | np.isnan(np.array([1., np.nan, 3.])) → [False, True, False] |
np.clip() | 将元素限制在指定范围内(截断) | np.clip(arr, 2, 8) # 小于2的设为2,大于8的设为8 |
np.apply_along_axis() | 沿指定轴应用自定义函数 | np.apply_along_axis(np.mean, axis=1, arr=arr) # 按行求均值 |
核心总结:
NumPy的核心价值是**“向量化运算”**——通过ndarray数组和内置方法,替代Python循环实现高效的数值计算,尤其适合处理多维数值数据(如机器学习特征、科学计算矩阵等)。掌握上述方法,可覆盖90%以上的基础到进阶使用场景。
