python学习笔记——numpy
目录
参考文章:
https://www.cnblogs.com/kitamu/p/13732078.html#numpy基础运算
https://www.cnblogs.com/clnchanpin/p/19521862
numpy中支持的数据类型
最典型的两个 int float
import numpy as np
# 整数数组
a = np.array([1, 2, 3], dtype=int)
print(a.dtype) # 输出:int64(系统默认64位整数)
# 浮点数数组
b = np.array([1.1, 2.2, 3.3], dtype=float)
print(b.dtype) # 输出:float64(系统默认64位浮点数)
更细分的类型
| 大类 | 类型标识 | 占用字节 | 含义 & 实战场景 |
|---|---|---|---|
| 布尔型 | bool_ | 1 字节 | 存储 True/False,布尔索引筛选数据 |
| 有符号整型 | int8/int16/int32/int64 | 1/2/4/8 字节 | 正负整数,int32深度学习标签常用 |
| 无符号整型 | uint8/uint16/uint32/uint64 | 1/2/4/8 字节 | 非负整数,uint8专门存储图像像素 (0~255) |
| 浮点型 | float32/float64 | 4/8 字节 | 小数,float32 节省显存,深度学习默认;float64 高精度科学计算 |
| 复数型 | complex64/complex128 | 8/16 字节 | 复数运算,信号处理、傅里叶变换使用 |
使用示例:
import numpy as np
arr = np.array([1,2,3], dtype=np.float32)
numpy中多维数组的创建
标准模板:
array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
标准np.array函数中参数说明:
| 参数 | 默认值 | 核心作用 | 速记示例 |
|---|---|---|---|
| object | 必填 | 数据源:列表 / 元组 / 已有数组,转为 ndarray | np.array([1,2,3]) |
| dtype | None | 指定元素类型;不填自动识别类型(int/float)NumPy | dtype=np.float32 |
| copy | True | True 必新开内存(拷贝);False 尽量共用原数据(视图)NumPy | copy=False节省内存 |
| order | 'K' | 内存排布:C 行优先、F 列优先、K 沿用原存储顺序NumPy | order='F'列存 |
| subok | False | False 强制返回原生 ndarray;True 保留数组子类类型 | 自定义数组类用 True |
| ndmin | 0 | 强制扩充最小维度,前面补长度为 1 的轴 | ndmin=2一维变(1,3) |
一些常见的特殊的创建方法
| 函数 / 方法 | 语法示例 | 功能说明 | 输出效果 | 深度学习 / 实战用途 |
|---|---|---|---|---|
| np.array() | np.array([1,2,3])、np.array([[1,2],[3,4]]) | 从列表 / 元组创建多维数组 | 1 维:[1 2 3];2 维:2 行 2 列矩阵 | 加载数据集、构造输入 / 标签、数据预处理最常用 |
| np.zeros() | np.zeros((2,3)) | 创建全 0 数组,参数为形状元组 | 2 行 3 列,所有元素 = 0 | 初始化权重矩阵、掩码 mask、占位数组 |
| np.ones() | np.ones((3,4)) | 创建全 1 数组 | 3 行 4 列,所有元素 = 1 | 常量初始化、偏置项 bias、维度占位 |
| np.eye() | np.eye(3) | 生成单位方阵,对角线为 1 其余 0 | 3×3 单位矩阵 | 初始化线性层、残差连接、矩阵求逆运算 |
| np.arange() | np.arange(5)、np.arange(1,6,2) | 左闭右开生成整数序列,可设步长 | [0 1 2 3 4]、[1 3 5] | 生成索引、划分数据集、构造序列数据 |
| np.diag() | np.diag(range(1,5)) | 用一维数组生成对角矩阵,元素落在主对角线 | 4 阶对角阵:对角线[1,2,3,4],其余 0 | 构造对角权重、稀疏矩阵初始化 |
| np.linspace() | np.linspace(0,10,num=5) | 闭区间均分采样,指定总个数 | [0.,2.5,5.,7.5,10.] | 生成采样坐标、学习率序列 |
| np.random.rand() | np.random.rand(2,3) | 生成 0~1 均匀分布浮点数组 | 2 行 3 列,取值[0,1) | 简易权重初始化、随机掩码 |
| np.random.randn() | np.random.randn(2,3) | 标准正态分布 (μ=0,σ=1) | 2 行 3 列正态随机数 | 神经网络权重初始化首选 |
numpy 多维数组有哪些属性
| 属性 | 含义 | 补充说明 | 示例 |
|---|---|---|---|
| dtype | 数组元素的数据类型 | 常用:int32、float32、float64,深度学习多用 float32 省内存 | arr.dtype → float32 |
| ndim | 数组维度总数 | 一维 = 1、二维 = 2、三维图像 = 3 | (32,28,28).ndim →3 |
| shape | 各维度长度(元组) | 一维格式(N,)带逗号;(32,28,28)代表 32 张 28×28 图片 | arr.shape → (3,) / (2,3) |
| size | 全部元素总数量 | 各维度数值相乘 | shape(2,3) → size=6 |
| itemsize | 单个元素占用字节数 | float32 占 4 字节,int64 占 8 字节 | arr.itemsize →4 |
| strides | 内存跨距、元素访问步长 | 存储层面内存寻址间隔 | 一维数组通常(4,) |
numpy数组的索引和切片
本质:数组的索引是指获取数组中单一元素的操作,而切片是获取数组中一部分元素并组成一个新数组的操作
- 注意
切片操作得到的数据子集是原数组的一种展示方式(称为视图)
• 视图仍然具有正常数组的行为、效率得到提升
• 视图中的改动将影响原数组数据
1.一维数组的索引与切片与python中的列表十分类似
数组的索引 arr[index]
数组的切片 arr[start:stop:step] 注意[start,stop)
#一维数组的索引
arr = np.arange(10) # 创建数组 [0 1 2 3 4 5 6 7 8 9]
# 获取索引为 0 的元素
print(arr[0]) # 输出: 0
# 获取索引为 7 的元素
print(arr[-3]) # 输出: 7,倒数第三个元素
#一维数组的切片(arr[start:stop:step]左闭右开)
arr = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
# 获取从索引 2 到 5 的元素(不包含 5)
print(arr[2:5]) # 输出: [2 3 4]
# 获取从索引 0 到 5 的元素,步长为 2
print(arr[0:5:2]) # 输出: [0 2 4]
# 省略 start,表示从开头开始
print(arr[:5]) # 输出: [0 1 2 3 4]
# 省略 stop,表示到末尾结束
print(arr[5:]) # 输出: [5 6 7 8 9]
# 步长为负数,表示反向切片
print(arr[::-1]) # 输出: [9 8 7 6 5 4 3 2 1 0] (反转数组)
2.二维数组的索引与切片
数组的索引:arr[row_index, col_index]
数组的切片:arr[start:stop:step,start:stop:step]
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 获取第 0 行的所有元素
print(arr_2d[0, :]) # 输出: [1 2 3]
# 获取所有行的第 1 列元素
print(arr_2d[:, 1]) # 输出: [2 5 8]
# 获取第 0-1 行,第 1-2 列的元素
print(arr_2d[0:2, 1:3])
# 输出:
# [[2 3] [5 6]]
# 获取所有行,步长为 2 的列
print(arr_2d[:, ::2])
# 输出:
# [[1 3][4 6] [7 9]]
3.多维数组的索引与切片
本质:多个维度上的索引与切片原理其实一致,arr(axis=0上的索引/切片,axis=1上的索引/切片,axis=2上的索引/切片...)最终都能取到相应的值
4.高级索引:
1.布尔索引
通过布尔数组来筛选元素,返回所有对应True位置的元素(多个数组判定条件则可以使用 & | 运算符进行分割条件)
布尔索引 = 用 True/False 筛数据,多条件用 & 和 |,每个条件加括号!
2.整数数组索引
通过整数数组来指定要获取的元素索引,返回一个新数组,其元素为原数组中对应索引的元素。
| 操作类型 | 语法格式 | 核心功能 | 示例代码 | 实战场景 |
|---|---|---|---|---|
| 基础索引 | arr[index] | 根据下标取单个元素 | arr=np.array([2,4,6]); arr[1] → 4 | 精准取指定位置样本、标签 |
| 切片索引 | arr[start:stop:step] | 连续截取一段元素,左闭右开 | arr[0:3:1],取前 3 个数据 | 批量截取连续数据集、图片切块 |
| 布尔索引 | arr[mask] | 布尔掩码筛选,保留True对应元素 | arr[arr>3],多条件:arr[(a>1)&(a<5)] | 过滤异常值、筛选指定类别数据 |
| 整数数组索引 | arr[[idx1,idx2...]] | 按自定义离散下标批量取元素 | arr[[0,2]],取下标 0、2 | 随机采样、打乱选取指定样本 |
- 注意:上述整数数组索引的值取的方式是每个轴上数据依次取值,例arr_2d[[0, 1, 2], [0, 2, 1]],取值取的是axis=0轴上的0和axis = 1轴上的0组成第一个索引(0,0),依次类推取(1,2),(2,1),多维整数数组索引取值类似。
1.布尔索引的案例
arr = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
# 创建一个布尔数组
mask = arr > 5 # [False False False False False False True True True True]
# 使用布尔数组进行索引
print(arr[mask]) # 输出: [6 7 8 9]
# 也可以直接在索引中使用条件表达式
print(arr[arr % 2 == 0]) # 输出: [0 2 4 6 8] (筛选偶数)
2.整数数组索引
arr = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
# 获取索引为 0, 2, 4 的元素
print(arr[[0, 2, 4]]) # 输出: [0 2 4]
# 也可以使用多维整数数组
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 获取 (0,0), (1,2), (2,1) 位置的元素
print(arr_2d[[0, 1, 2], [0, 2, 1]]) # 输出: [1 6 8]
numpy多维数组改变形状+矩阵转置
修改维度
| 函数 | 作用 | 核心特点 | 示例 |
|---|---|---|---|
| reshape() | 修改数组维度形状 | 元素总数不变,参数可写-1自动推导维度 | np.arange(12).reshape(3,-1) |
| expand_dims() | 增加长度为 1 的新维度 | 指定 axis 确定新增维度位置,常用于扩充 batch、通道维 | np.expand_dims(arr,axis=0) |
| ravel() | 多维展平一维 | 优先视图,内存不连续则拷贝 | arr.ravel() |
| squeeze() | 剔除长度 = 1 的冗余维度 | 返回视图 | np.squeeze(arr,axis=0) |
| expand_dims() / np.newaxis | 新增长度 = 1 的维度 | 返回视图 | np.expand_dims(arr,axis=0) |
| np.resize (数组,新形状) | 缺元素 → 循环重复原数组 超量 → 截断 | 返回新数组 | a = np.array([[1,2],[3,4]]) b = np.resize(a, (3,3)) |
多维展平
| 函数 | 作用 | 核心特点 | 示例 |
|---|---|---|---|
| flatten() | 多维展平为一维 | 生成新数组,修改结果不影响原数据 | arr.flatten() |
| ravel() | 多维展平为一维 | 返回原数组视图,运行速度更快 | arr.ravel() |
维度调换
| 函数 | 作用 | 核心特点 | 示例 |
|---|---|---|---|
| .T | 二维矩阵转置 | 行列互换,仅适配二维数组 | arr.T |
| transpose() | 自定义维度调换 | 自由指定维度顺序,图像 CHW↔HWC 转换专用 | img.transpose(1,2,0) |
numpy遍历
np.nditer numpy遍历相关性质:

| 遍历对象 | 遍历输出结果 | 原理说明 |
|---|---|---|
| a | 0 1 2 3 4 5 | 默认 C 顺序(行优先存储),逐行遍历 |
| a.T | 0 3 1 4 2 5 | 真正改变的只有 2 个东西:shapestrides(步长)它决定怎么读取内存,转置后底层内存没变,但是内存存储顺序变为F,列优先 |
| a.T.copy(order='C') | 0 1 2 3 4 5 | 拷贝并改用 C 顺序重排内存,变回行优先遍历 |
总结:
- 每个数组自带 C / F 标记
- nditer 只读这个标记,决定遍历顺序
- a.T 会把数组标记成 F 风格
NumPy 数组修改操作汇总表
共性:这类函数全部生成新数组(拷贝),不返回视图,原数组不受改动
旋转+翻转
| 分类 | 函数 | 功能说明 | 示例 |
|---|---|---|---|
| 调整元素顺序 | np.rot90() | 数组逆时针旋转 90° | np.rot90(arr) |
| np.fliplr() | 左右翻转矩阵 | np.fliplr(arr) | |
| np.flipud() | 上下翻转矩阵 | np.flipud(arr) | |
| np.sort() | 沿指定轴排序元素 | np.sort(arr,axis=0) |
数组堆叠拼接
| 分类 | 函数 | 功能说明 | 示例 |
|---|---|---|---|
| 数组堆叠拼接 | np.hstack() | 水平(列方向)拼接数组 | np.hstack([a,b]) |
| np.vstack() | 竖直(行方向)拼接数组 | np.vstack([a,b]) | |
| np.dstack() | 深度维度堆叠(新增第三维) | np.dstack([a,b]) | |
| np.concatenate() | 指定轴通用拼接,最灵活 | np.concatenate([a,b],axis=0) |
增删元素(其实没用)
| 分类 | 函数 | 功能说明 | 示例 |
|---|---|---|---|
| 增删元素 | np.append() | 数组末尾追加元素,生成新数组 | np.append(arr,[7,8]) |
| np.insert() | 指定下标插入数据 | np.insert(arr,2,99) | |
| np.delete() | 按索引删除元素 | np.delete(arr,1) |
频繁append/insert效率低,大数据优先预分配zeros再赋值
numpy多维数组涉及的ufuncs
| 类别 | 说明 | 典型函数 |
|---|---|---|
| 数学运算 | 基础算术运算 | add, subtract, multiply, matmul, divide, power, remainder |
| 三角函数 | 三角与双曲函数 | sin, cos, tan, sinh, cosh, tanh, arcsin, arccos |
| 位运算 | 二进制位操作 | bitwise_and, bitwise_or, bitwise_xor, invert, left_shift |
| 比较 / 逻辑运算 | 关系与逻辑判断 | greater, greater_equal, less, equal, logical_and, logical_or |
| 浮点运算 | 浮点数特殊处理 | isfinite, isinf, isnan, fabs, floor, ceil, fmod |
NumPy 中通用函数(ufunc)的调用方式与核心参数
op(*x[, out], where=True, **kwargs)
op 代表任意 ufunc(如np.add、np.sin等)
作用:对输入数组 *x 执行元素级运算,并自动支持广播规则
详细参数详解:
| 参数 | 作用 | 关键说明 |
|---|---|---|
| *x | 输入数组 | 数量由函数类型,可以是单个或多个array-like对象(列表、元组、NumPy 数组等) |
| out | 指定输出位置 | 允许将计算结果直接写入已存在的数组,避免额外内存分配;数组形状必须与广播结果匹配 |
| where | 指定作用元素 | 只在条件为True的位置执行运算,其余位置保留原数组的值;若out未初始化,条件为False的位置将保持未初始化状态 |
| **kwargs | 其他关键字参数 | 包含dtype、casting、order等,详见 NumPy 官方文档 |
使用示例:
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
result = np.empty(4)
# 使用out参数直接写入结果
np.add(a, b, out=result)
print(result) # [11. 22. 33. 44.]
# 使用where参数只对部分元素运算
np.add(a, b, out=result, where=[True, False, True, False])
print(result) # [11. 22. 33. 44.](False位置保持原out值,这里是上一步的结果)
广播机制
略
NumPy ufunc 高级功能速查表
略
numpy重要函数
彻底弄懂 axis 是什么(现阶段一般都在二维里面使用)
axis 不是 “对谁操作”,而是 “沿着谁操作”
axis = 要被消掉 / 压扁的维度
axis=0 上下压,axis=1 左右压
求和均值标准差 最值 累计和/积 所有/任一判断
| 函数 | 功能 | 示例 |
|---|---|---|
| np.sum / np.mean / np.std / np.var | 求和、均值、标准差、方差 | data.mean(axis=0) |
| np.min / np.max | 最小 / 最大值 | data.max(axis=(0,2)) |
| np.argmin / np.argmax | 最小 / 最大值的索引 | np.argmax(data, axis=1) |
| np.cumsum / np.cumprod | 累积和、累积积 | data.cumsum(axis=0) |
| np.all / np.any | 是否所有 / 任一元素非零 | np.all(data > 0) |
条件选择
| 函数 | 功能 | 示例 |
|---|---|---|
| np.where(cond, x, y) | 条件为真取 x,否则取 y | np.where(x<0, x2, x3) |
| np.select(condlist, choicelist) | 多条件分支选择 | np.select([x<-1, x<2, x>=2], [x2, x3, x**4]) |
| np.choose(index, choices) | 根据索引从列表中取值 | np.choose([0,0,1,1,2,2], [x1, x2, x3]) |
| np.nonzero | 返回非零元素的索引 | np.nonzero(data > 0) |
去重 元素是否存在 交差并集
| 函数 | 功能 |
|---|---|
| np.unique | 去除重复元素,返回有序的唯一值数组 |
| np.in1d | 判断元素是否在目标数组中 |
| np.intersect1d | 求两个数组的交集 |
| np.setdiff1d | 求两个数组的差集 |
| np.union1d | 求两个数组的并集 |
点积 叉乘 外积
| 函数 | 功能 |
|---|---|
| np.dot / np.inner | 点积(矩阵乘法、向量内积) |
| np.cross | 向量叉积 |
| np.outer | 向量外积 |
| np.tensordot | 沿指定轴进行点积(支持高维) |
| np.kron | Kronecker 积 |
| np.einsum | 爱因斯坦求和(灵活实现多种矩阵运算) |

浙公网安备 33010602011771号