Python中NumPy库的核心知识总结大全
作者:shasha225_
NumPy是Python编程语言中一个开源的数值计算扩展库,它为Python提供了高性能的多维数组对象以及一系列用于处理这些数组的数学函数,是科学计算、数据分析等领域的基础工具之一,这篇文章主要介绍了Python中NumPy库的核心知识总结大全,需要的朋友可以参考下
一、核心对象:ndarray(N维数组)
1.1 定义与特点
- ndarray:存储同类型元素的多维容器,所有元素必须是同一数据类型(同构性),这是其高性能的基础。
- 与 Python 列表的区别:
- 列表可存储不同类型元素,而
ndarray元素类型统一。 - 列表不支持向量化运算(如
list1 + list2是拼接,而非元素相加),ndarray支持。
- 列表可存储不同类型元素,而
1.2 核心属性
| 属性 | 描述 | 示例(arr = np.array([[1,2],[3,4]])) |
|---|---|---|
shape | 数组维度的元组,格式为 (维度1大小, 维度2大小, ...) | (2, 2)(2 行 2 列) |
dtype | 元素的数据类型(如 int32、float64) | int64(默认整数类型) |
ndim | 数组的维度数(秩) | 2(二维数组) |
size | 数组元素的总个数(shape 各元素乘积) | 4(2×2) |
itemsize | 单个元素的字节大小 | 8(int64 占 8 字节) |
nbytes | 数组总字节大小(size × itemsize) | 32(4×8) |
data | 指向数组数据的缓冲区(一般不直接使用) | 内存地址指针 |
示例:
import numpy as np arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.shape) # (2, 3) print(arr.dtype) # int64 print(arr.ndim) # 2 print(arr.size) # 6
二、数组创建方法
2.1 从 Python 序列创建
- 基础语法:
np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)object:输入序列(列表、元组等)。dtype:指定数据类型(如np.int32、np.float64),不指定则自动推断。ndmin:指定最小维度数(不足则补维度)。
示例:
# 1维数组 arr1 = np.array([1, 2, 3, 4]) # 2维数组(列表嵌套列表) arr2 = np.array([[1, 2], [3, 4]], dtype=np.float32) # 指定为32位浮点数 # 强制为3维数组(即使输入是2维) arr3 = np.array([[1, 2], [3, 4]], ndmin=3) # shape 为 (1, 2, 2)
2.2 创建特殊数组
| 函数 | 描述 | 示例 |
|---|---|---|
np.zeros(shape) | 创建全 0 数组 | np.zeros((2,3)) → 2 行 3 列全 0 数组 |
np.ones(shape) | 创建全 1 数组 | np.ones(5) → 1 维 5 元素全 1 数组 |
np.full(shape, val) | 创建填充指定值 val 的数组 | np.full((2,2), 10) → 2×2 全 10 数组 |
np.empty(shape) | 创建未初始化数组(值为内存随机值,速度快) | np.empty((3,3)) |
np.arange(start, stop, step) | 生成整数序列(类似 range,但返回数组),start 默认为 0,step默认为 1 | np.arange(1, 10, 2) → [1,3,5,7,9] |
np.linspace(start, stop, num) | 生成 num 个等间隔的数(包含 start 和 stop) | np.linspace(0, 1, 5) → [0,0.25,0.5,0.75,1] |
np.eye(n, k=0) | 创建 n×n 单位矩阵(对角线为 1,其余为 0),k 控制对角线偏移(正上负下) | np.eye(3, k=1) → 上对角线为 1 |
np.diag(arr) | 从 1 维数组创建对角矩阵,或从多维数组提取对角线 | np.diag([1,2,3]) → 3×3 对角矩阵 |
2.3 随机数组(np.random模块)
| 函数 | 描述 |
|---|---|
np.random.rand(d0, d1, ...) | 生成 [0,1) 均匀分布的随机数数组 |
np.random.randn(d0, d1, ...) | 生成标准正态分布(均值 0,方差 1)的随机数数组 |
np.random.randint(low, high, size) | 生成 [low, high) 范围内的随机整数数组 |
np.random.choice(arr, size) | 从 arr 中随机采样生成数组 |
np.random.shuffle(arr) | 原地打乱数组顺序(仅对第一维有效) |
示例:
np.random.rand(2, 3) # 2行3列 [0,1) 随机数 np.random.randint(1, 10, size=(3,)) # 1维3元素,值在1~9之间
三、数组操作(维度与形态)
3.1 维度调整
reshape(shape):返回一个新数组,维度为shape,原数组不变(需满足size一致)。
arr = np.arange(12) # shape (12,) arr_reshape = arr.reshape(3, 4) # shape (3,4),元素不变
- flatten() vs ravel():均将数组降为 1 维,区别在于:
flatten():返回原数组的副本(修改新数组不影响原数组)。ravel():返回原数组的视图(修改新数组会影响原数组,内存效率更高)。
arr = np.array([[1,2],[3,4]]) arr_flat = arr.flatten() # 副本 arr_rav = arr.ravel() # 视图
newaxis:为数组增加一个维度(常用于广播或匹配维度)。
arr = np.array([1,2,3]) # shape (3,) arr_2d = arr[np.newaxis, :] # shape (1,3)(行向量) arr_2d_col = arr[:, np.newaxis] # shape (3,1)(列向量)
3.2 数组拼接
np.concatenate(arrays, axis=0):沿指定轴拼接多个数组(要求除拼接轴外,其他维度大小一致)。axis=0:垂直拼接(行方向),axis=1:水平拼接(列方向)。
- 简化函数:
np.vstack(tup):垂直拼接(等价于concatenate(tup, axis=0))。np.hstack(tup):水平拼接(等价于concatenate(tup, axis=1))。np.dstack(tup):深度拼接(沿第三维,适合 3D 数组)。
示例:
a = np.array([[1,2], [3,4]]) # shape (2,2) b = np.array([[5,6], [7,8]]) # shape (2,2) np.concatenate([a, b], axis=0) # 垂直拼接 → shape (4,2) np.hstack([a, b]) # 水平拼接 → shape (2,4)
3.3 数组分割
np.split(ary, indices_or_sections, axis=0):沿指定轴分割数组。indices_or_sections:若为整数n,则平均分成n份;若为列表,则按索引分割。
- 简化函数:
np.vsplit(垂直分割)、np.hsplit(水平分割)、np.dsplit(深度分割)。
示例:
arr = np.arange(12).reshape(3,4) # shape (3,4) # 按索引分割(axis=0,行方向) np.split(arr, [1,3], axis=0) # 分割为 [0:1行, 1:3行] # 平均分成2份(axis=1,列方向) np.hsplit(arr, 2) # 分割为 [0:2列, 2:4列]
3.4 转置与轴交换
arr.T:数组转置(适用于 2D 数组,行变列、列变行)。arr.transpose(*axes):自定义轴的顺序(多维数组常用)。
arr = np.arange(8).reshape(2,2,2) # shape (2,2,2) arr_trans = arr.transpose(1,0,2) # 交换0轴和1轴,新shape (2,2,2)
四、索引与切片(元素访问)
NumPy 支持多种索引方式,用于精准访问数组元素。
4.1 基本索引(单元素访问)
- 多维数组用逗号分隔各维度索引:
arr[dim0_idx, dim1_idx, ...]。 - 索引从 0 开始,支持负索引(-1 表示最后一个元素)。
示例:
arr = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 3×3数组 print(arr[0, 1]) # 第0行第1列 → 2 print(arr[2, -1]) # 第2行最后一列 → 9
4.2 切片(范围访问)
- 语法:
start:end:step(start默认为 0,end默认为维度大小,step默认为 1)。 - 多维切片:各维度切片用逗号分隔,
:表示取该维度所有元素。
示例:
arr = np.arange(12).reshape(3,4) # 3行4列:[[0,1,2,3],[4,5,6,7],[8,9,10,11]] # 取第1行(索引0)的第1到第3列(不包含3) print(arr[0, 1:3]) # [1,2] # 取第0到第2行(不包含2)的所有列 print(arr[0:2, :]) # [[0,1,2,3], [4,5,6,7]] # 每隔1行取1行,每隔2列取1列 print(arr[::2, ::2]) # [[0,2], [8,10]]
4.3 布尔索引(条件筛选)
- 用布尔数组(与原数组同 shape)筛选元素,结果为满足条件的元素组成的 1 维数组。
示例:
arr = np.array([[1,2,3], [4,5,6], [7,8,9]]) # 筛选大于5的元素 mask = arr > 5 # 布尔数组:[[False,False,False], [False,False,True], [True,True,True]] print(arr[mask]) # [6,7,8,9] # 复合条件(需用 & 连接,而非 and) print(arr[(arr > 3) & (arr < 8)]) # [4,5,6,7]
4.4 花式索引(指定位置访问)
- 用整数数组(列表)指定需要访问的索引,结果为对应位置元素组成的新数组。
示例:
arr = np.array([10, 20, 30, 40, 50]) # 1维数组:取索引0, 2, 4的元素 print(arr[[0, 2, 4]]) # [10,30,50] # 2维数组:取 (0,1)、(2,3) 位置的元素 arr2d = np.arange(12).reshape(3,4) print(arr2d[[0,2], [1,3]]) # [1, 11]
注意:
- 切片返回的是原数组的视图(修改会影响原数组)。
- 布尔索引和花式索引返回的是副本(修改不影响原数组)。
五、广播机制(Broadcasting)
广播是 NumPy 中不同形状数组进行算术运算的核心机制,无需手动扩展数组维度。
5.1 广播规则
- 维度对齐:若两个数组维度不同,在形状较短的数组前补 1,直到维度数相同。
- 例:
shape (2,3)与shape (3,)→ 补 1 后为(2,3)与(1,3)。
- 例:
- 维度兼容:对于对齐后的每个维度,若大小相同,或其中一个为 1,则兼容;否则报错。
- 兼容示例:
(2,3)与(1,3)→ 第 0 维 2 vs 1(兼容),第 1 维 3 vs 3(兼容)。 - 不兼容示例:
(2,3)与(2,4)→ 第 1 维 3 vs 4(不兼容,报错)。
- 兼容示例:
- 扩展维度:兼容的维度中,大小为 1 的维度会被扩展为与另一个数组相同的大小(虚拟扩展,不占用内存)。
5.2 广播示例
# 示例1:1维数组与标量广播 a = np.array([1, 2, 3]) b = 2 print(a + b) # [3,4,5](b 广播为 [2,2,2]) # 示例2:2维数组与1维数组广播 a = np.array([[1,2,3], [4,5,6]]) # shape (2,3) b = np.array([10, 20, 30]) # shape (3,) → 广播为 (1,3) → 再扩展为 (2,3) print(a + b) # [[11,22,33], [14,25,36]] # 示例3:高维广播 a = np.ones((2, 1, 3)) # shape (2,1,3) b = np.ones((1, 2, 3)) # shape (1,2,3) # 对齐维度后:(2,1,3) 与 (1,2,3) → 扩展为 (2,2,3) print((a + b).shape) # (2,2,3)
六、数学运算
6.1 元素级运算
支持 +、-、*、/、**(幂)、%(取模)等运算符,或对应的函数(如 np.add)。
示例:
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # [5,7,9](元素相加) print(a * b) # [4,10,18](元素相乘) print(a **2) # [1,4,9](元素平方) print(np.subtract(b, a)) # [3,3,3](等价于 b - a)
6.2 聚合函数(沿轴运算)
对数组沿指定轴(axis)进行统计或聚合,返回标量或降维数组。
| 函数 | 描述 | 示例(arr = np.array([[1,2],[3,4]])) |
|---|---|---|
np.sum(arr, axis) | 求和 | np.sum(arr, axis=0) → [4,6](按列求和) |
np.mean(arr, axis) | 均值 | np.mean(arr) → 2.5(全局均值) |
np.median(arr, axis) | 中位数 | np.median(arr, axis=1) → [1.5, 3.5](按行求中位数) |
np.max(arr, axis) / np.min(arr, axis) | 最大 / 最小值 | np.max(arr, axis=0) → [3,4] |
np.std(arr, axis) / np.var(arr, axis) | 标准差 / 方差 | np.std(arr) → ~1.118 |
np.cumsum(arr, axis) | 累积和 | np.cumsum(arr) → [1,3,6,10] |
注意:axis 不指定时,默认对全局所有元素运算。
6.3 矩阵运算
-** 矩阵乘法 **:np.dot(a, b) 或 a @ b(要求 a 的列数 = b 的行数)。
a = np.array([[1,2], [3,4]]) # 2×2矩阵 b = np.array([[5,6], [7,8]]) # 2×2矩阵 print(a @ b) # 等价于 np.dot(a,b) → [[19,22], [43,50]]
-** 矩阵转置 :a.T(行变列,列变行)。
- 其他矩阵函数 **:np.linalg.inv(a)(矩阵求逆)、np.linalg.det(a)(行列式)、np.linalg.eig(a)(特征值和特征向量)等。
七、数据类型(dtype)与转换
7.1 常用数据类型
NumPy 支持比 Python 更多的数据类型,常见类型如下:
| 类型 | 描述 | 示例 |
|---|---|---|
int8/int16/int32/int64 | 有符号整数(8/16/32/64 位) | np.int32 |
uint8/uint16... | 无符号整数(仅正整数) | np.uint8 |
float16/float32/float64 | 浮点数(精度递增) | np.float64(默认) |
complex64/complex128 | 复数(实部 + 虚部) | np.complex128 |
bool | 布尔值(True/False) | np.bool_ |
string_ | 字符串(固定长度) | np.string_ |
7.2 数据类型转换
- 用
arr.astype(dtype)转换,返回新数组(原数组不变)。
示例:
arr = np.array([1, 2, 3], dtype=np.int32) arr_float = arr.astype(np.float64) # 转为float64 → [1. 2. 3.] arr_str = arr.astype(np.string_) # 转为字符串 → [b'1' b'2' b'3']
总结
到此这篇关于Python中NumPy库核心知识总结大全的文章就介绍到这了,更多相关Python NumPy库核心知识内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
