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遍历相关性质:

d623cea5-b7f1-4878-8f77-39733e26d95c

遍历对象 遍历输出结果 原理说明
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 爱因斯坦求和(灵活实现多种矩阵运算)
posted @ 2026-06-06 17:00  RReally  阅读(32)  评论(0)    收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中