初识NumPy

初识NumPy

七月 19, 2025 阅读量

接受朋友建议,开始学习AI相关的东西,简单记录下。

简介

NumPy(Numerical Python)是Python的一个扩展库,提供多维数组与矩阵运算,运行速度快。

安装

pip安装(以Python3为例,Python用pip)

1
pip3 install numpy

conda安装

1
conda install numpy

验证安装

1
2
import numpy as np
print(np.__version__)

安装成功,会输出正确的版本号

Ndarray-N维数组对象

NumPy数组的维数称为秩(rank),秩就是轴(axis)的数量,即数组的维度(dimensions)
属性:
ndarray.ndim 数组的轴数(维度)
ndarray.shape 数组的纬度,表示数组在每个轴上的大小(各维度的长度)
ndarray.size 数组的元素总数
ndarray.dtype 数组中元素类型

图片表示数组数据类型的类型对象的层次结构。未显示用于索引的两种整数类型intp和uintp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
('字符代码', 别名)

整数
numpy.int8('b','i1', byte -128到127),
numpy.int16('h','i2', short),
numpy.int32('i','i4', intc),
numpy.int64('i8',longlong,'q'),
numpy.int_('l',long;intp 用于索引的整数类型,指向足够大的整数类型以容纳C指针) 默认整数,64位系统上为64位,在32位系统上为32位(dtype指定'l'或者long,在Windows平台即使64位系统,固定映射为int32)
无符号整数
numpy.uint8('B','u1', ubyte 0到255),
numpy.uint16('H','u2', ushort),
numpy.uint32('I','u4', uintc),
numpy.uint64('u8', ulonglong,'Q'),
numpy.uint('L', ulong;uintp,足够大的无符号整数以容纳指针)(类上)
浮点数
numpy.float16('e', 'f2', half),
numpy.float32('f', 'f4', single),
numpy.float64('d', 'f8', double),
numpy.float128('g', longdouble) (在大多数x86-64系统上实际对应80位扩展精度浮点(理论应输出float80),但NumPy为保持兼容性默认映射为float64)
复数浮点数
numpy.comples64('F', 'c8', csingle),
numpy.comples128('D', 'c16', cdouble),
numpy.comples256('G', clongdouble)(类上,继承为两个float64组成的complex128)

字符串 numpy.bytes_('S') 后可加字符串长度比如'Dream',dtype为'<S5',长度为5,'c'等价于'S1'
Unicode字符串 numpy.str_('U') 后可加符串长度比
原始数据void numpy.void('V') 后可加符串长度比
布尔值 numpy.bool('?', 'b1', bool_)
日期时间 numpy.datetime64('M', 'M8')
时间间隔 numpy.timedelta64('m', 'm8')
对象 numpy.object_('O', 'O8')

ndarray.itemsize 数组中每个元素的大小(以字节为单位)
ndarray.data 数组的实际元素的缓冲区,一般通过索引访问元素,不直接使用该属性
ndarray.flags 有关内存布局信息,返回

1
2
3
4
5
6
C_CONTIGUOUS : 数据是否为C风格连续(行优先)
F_CONTIGUOUS : 数据是否为Fortran风格连续(列优先)
OWNDATA : 数组是否拥有底层数据的所有权
WRITEABLE : 数组是否可修改
ALIGNED : 数据内存地址是否按硬件对齐
WRITEBACKIFCOPY : 数组是否拥有数据所有权

ndarray.real 数组中每个元素的实部(如果元素类型为复数)
ndarray.imag 数组中每个元素的虚部(如果元素类型为复数)
ndarray.strides 每个维度上以字节为单位的步长
ndarray.base 数组的数据来源对象(返回None独立拥有数据内存(非视图);返回ndarray对象与其他数组的视图或派生对象(共享内存))
ndarray.T 快速获取数组转置视图
ndarray.array_interface 数组协议:Python端,描述数组内存布局的底层字典接口
ndarray.array_struct 数组协议:结构体,底层 C 结构体接口
ndarray.array_priority 数组优先级
ndarray.array_wrap 自定义数组运算结果包装行为

创建数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
使用array函数从普通的Python列表或元组创建数组
import numpy as np
a = np.array([1, 2])
b = np.array([1, 2], dtype='i') #指定数据类型-字符代码
c = np.array([1, 2], dtype=np.int32) #指定数据类型
c2 = np.asarray([1, 2]) #避免内存复制
c3 = np.asanyarray([1, 2]) #避免内存复制 保留子类特性


使用zeros函数创建全零数组
d = np.zeros((2, 3))
d2 = np.zeros_like(d) #与给定数组具有相同形状和类型的新数组

使用ones函数创建全一数组
e = np.ones((3, 2))
e2= np.ones_like(e)

使用empty函数创建一个内容随机数组
f = np.empty((1, 2))
f2 = np.empty_like(f)

使用arange函数创建一个数字序列数组(指定步长值)
g = np.arange(1, 10, 2)

使用linspace函数创建一个数字序列数组(指定元素数量,浮点数推荐)
h = np.linspace(0, 2, 9)

使用full函数创建一个用指定元素填充的数组
i = np.full((2, 3), 'xu')
i2 = np.full_like(i, 2)


numpy.eye 对角线上为1,其余位置为0的二维数组
numpy.identity 方阵,其主对角线元素为一
numpy.ascontiguousarray 返回内存中连续的数组
numpy.asmatrix 将输入解释为矩阵
numpy.astype 将数组复制到指定的数据类型
numpy.copy 返回给定对象的数组副本
numpy.frombuffer 将缓冲区解释为一维数组
numpy.from_dlpack 从实现__dlpack__协议的对象创建数组
numpy.fromfile 从文本或二进制文件中的数据构造数组
numpy.fromfunction 通过对每个坐标执行函数来构造数组
numpy.fromiter 从可迭代对象创建新的1维数组
numpy.fromstring 从字符串中的文本数据初始化新的1维数组
numpy.loadtxt 从文本文件加载数据
记录数组
numpy.rec.array 从多种对象构造记录数组
numpy.rec.fromarrays 从(扁平)数组列表创建记录数组
numpy.rec.fromrecords 从文本形式的记录列表创建记录数组
numpy.rec.fromstring 从二进制数据创建记录数组
numpy.rec.fromfile 从二进制文件数据创建数组
字符数组
numpy.char.array
numpy.char.asarray
数值范围
numpy.arange 返回给定区间内均匀分布的值
numpy.linspace 在指定区间内返回均匀分布的数字
numpy.logspace 返回在对数尺度上均匀分布的数字
numpy.geomspace 返回在对数尺度上均匀分布的数字(几何级数)
numpy.meshgrid 从坐标向量返回坐标矩阵的元组
numpy.mgrid 返回密集多维“网格”的实例
numpy.ogrid 返回开放多维“网格”的实例
矩阵
numpy.diag 提取对角线或构造对角数组
numpy.diagflat 创建一个以扁平化输入为对角线的二维数组
numpy.tri 一个在给定对角线及以下位置为一、其他位置为零的数组
numpy.tril 数组的下三角
numpy.triu 数组的上三角
numpy.vander 生成范德蒙德矩阵
numpy.bmat 从字符串、嵌套序列或数组构建矩阵对象

索引和切片

Ndarray数组下标从0开始,允许负索引从数组的末尾进行索引

1
2
3
x = np.arange(10)
print(x[0]) #0
print(x[-1]) #9

切片规则为start:stop:step,start为起始索引,stop为停止索引,step为步长

1
2
x[1:7:2]
array([1, 3, 5]) #array([1, 3, 5])

如果索引值超出范围,会抛出IndexError

高级索引:
整数数组索引 使用一个数组来访问另一个数组的元素
布尔数组索引 通过布尔运算来获取符合指定条件的元素的数组

广播

广播(Broadcast)是NumPy对不同形状的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。
对两个数组进行操作时,NumPy会逐元素比较它们的形状。它从末尾(即最右侧)维度开始,然后向左移动。

  1. 若两数组维度数不同,较小维度数组的左侧补1直到维度数相同
  2. 若某维度大小不同但其中一个为1,则小维度数组沿该维度扩展以匹配大数组
  3. 若某维度大小均不为1且不一致,则触发ValueError: operands could not be broadcast together异常

副本与视图

可以通过仅更改某些元数据(例如步长和数据类型)来以不同方式访问数组,而无需更改数据缓冲区。这创建了一种查看数据的新方式,这些新数组称为视图。数据缓冲区保持不变,因此对视图所做的任何更改都会反映在原始副本中。
当通过复制数据缓冲区和元数据来创建新数组时,这称为副本。对副本所做的更改不会反映在原始数组上。
ndarray.base属性可以轻松判断数组是视图还是副本。视图的base属性返回原始数组,而副本的base属性返回None。

常量

numpy.e 自然数e
numpy.pi 圆周率π
numpy.euler_gamma 欧拉常数γ
numpy.inf (正)无穷大
numpy.nan 非数字(NaN)
numpy.newaxis None别名

数组操做

numpy.copyto 复制数组到
numpy.ndim 返回数组的维度数量
numpy.shape 返回数组的形状
numpy.size 返回沿给定轴的元素数量
修改形状
numpy.reshape 不改变数据的条件下修改形状
numpy.ravel 返回展开数组
numpy.flat 数组元素迭代器
numpy.flatten 返回数组副本
翻转
numpy.moveaxis 将数组的轴移动到新位置
numpy.rollaxis 向后滚动指定的轴,直到它位于给定位置
numpy.swapaxes 交换数组的两个轴
numpy.transpose 返回一个轴已转置的数组(对换数组的维度)
numpy.T 转置数组的视图,同上transpose
numpy.permute_dims 返回一个轴已转置的数组
numpy.matrix_transpose 转置矩阵
改变纬度
numpy.atleast_1d 将输入转换为至少具有一个维度的数组
numpy.atleast_2d 将输入视为至少具有两个维度的数组
numpy.atleast_3d 将输入视为至少具有三个维度的数组
numpy.broadcast 生成一个模拟广播的对象
numpy.broadcast_to 将数组广播到新的形状
numpy.broadcast_arrays 任意数量的数组相互广播
numpy.expand_dims 扩展数组的形状
numpy.squeeze 移除长度为一的轴
改变类型
numpy.asarray 将输入转换为数组
numpy.asanyarray 将输入转换为ndarray,但让ndarray子类通过
numpy.asmatrix 将输入解释为矩阵
numpy.asfortranarray 返回一个在内存中以Fortran顺序布局的数组
numpy.ascontiguousarray 返回一个在内存中连续的数组
numpy.asarray_chkfinite 将输入转换为数组,并检查是否存在NaN或Inf
numpy.require 返回一个满足要求的指定类型的ndarray
连接
numpy.concatenate 沿着现有轴连接一系列数组
numpy.concat 沿着现有轴连接一系列数组
numpy.stack 沿着新轴连接一系列数组
numpy.block 从嵌套的块列表中组装一个nd-array
numpy.vstack 垂直(按行)堆叠数组
numpy.hstack 水平(按列)堆叠数组
numpy.dstack 沿深度方向(沿第三轴)堆叠数组
numpy.column_stack 将一维数组作为列堆叠成二维数组
分割
numpy.split 将数组分割成多个子数组视图
numpy.array_split 将数组分割成多个子数组
numpy.dsplit 沿第三轴(深度)将数组分割成多个子数组
numpy.hsplit 水平(按列)将数组分割成多个子数组。
numpy.vsplit 垂直(按行)将数组分割成多个子数组
numpy.unstack 沿给定轴将数组分割成一系列数组
平铺
numpy.tile 通过重复指定次数来构造数组
numpy.repeat 重复数组中的每个元素
添加和移除
numpy.delete 返回一个新数组,其中沿某个轴的子数组已被删除
numpy.insert 沿给定轴在给定索引前插入值
numpy.append 将值附加到数组的末尾
numpy.resize 返回具有指定形状的新数组
numpy.trim_zeros 移除沿某个维度上为零,且在所有其他维度上也都为零的值
numpy.unique 查找数组中的唯一元素
numpy.pad 填充数组
排序
numpy.flip 沿给定轴反转数组中元素的顺序
numpy.fliplr 沿轴 1(左右)反转元素的顺序
numpy.flipud 沿轴 0(上下)反转元素的顺序
numpy.roll 沿给定轴滚动数组元素
numpy.rot90 在由轴指定的平面内将数组旋转90度

位操做

numpy.bitwise_and 逐元素计算两个数组的位与运算
numpy.bitwise_or 逐元素计算两个数组的位或运算
numpy.bitwise_xor 逐元素计算两个数组的位异或运算
numpy.invert 逐元素计算位反转或位非运算
numpy.bitwise_invert 逐元素计算位反转或位非运算
numpy.left_shift 将整数的位向左移动
numpy.bitwise_left_shift 将整数的位向左移动
numpy.right_shift 将整数的位向右移动
numpy.bitwise_right_shift 将整数的位向右移动
numpy.bitwise_count 计算绝对值中1位的数量
numpy.packbits 将二进制值数组的元素打包为uint8数组中的位
numpy.unpackbits 将uint8数组的元素解包为二进制值输出数组
numpy.binary_repr 将输入数字的二进制表示形式作为字符串返回

字符串操做

numpy.add 按元素添加参数
numpy.center 居中字符串
numpy.capitalize 返回副本,其中每个元素的第一个字符大写
numpy.decode 按元素调用bytes.decode
numpy.encode 按元素调用str.encode
numpy.expandtabs 返回每个字符串元素的副本,其中所有制表符都替换为一个或多个空格
numpy.ljust 返回一个数组,左对齐
numpy.lower 返回一个数组,其中元素已转换为小写
numpy.lstrip 返回一个移除了前导字符的副本
numpy.mod 返回Python2.6之前的字符串格式化(插值),对一对str或unicode类型的类数组对象进行按元素操作
numpy.multiply 返回字符串多次连接后的字符串
numpy.partition 将的每个元素进行分区
numpy.replace 返回一个字符串副本,使用新字符串替换字符串中的所有子字符串
numpy.rjust 返回一个数组,右对齐
numpy.rpartition 将每个元素围绕最右边的分隔符进行分区(分割)
numpy.rstrip 返回一个移除了尾随字符的副本
numpy.slice 按指定进行切片
numpy.strip 返回一个移除了前导和尾随字符的副本
numpy.swapcase 按元素返回字符串的副本,其中大写字符转换为小写,反之亦然
numpy.title 按元素返回字符串或 Unicode 的标题化版本
numpy.translate 返回一个字符串副本,通过给定的翻译表进行映射
numpy.upper 返回一个数组,其中元素已转换为大写
numpy.zfill 返回用零左填充的数字字符串
……

数学函数

三角函数
numpy.sin 正弦
numpy.cos 余弦
numpy.tan 正切
numpy.arcsin 反正弦
numpy.asin 反正弦
numpy.arccos 反余弦
numpy.acos 反余弦
numpy.arctan 反正切
numpy.atan 反正切
numpy.hypot 给定直角三角形的“直角边”,返回其斜边
……
双曲函数
numpy.sinh 双曲正弦
numpy.cosh 双曲余弦
numpy.tanh 双曲正切
numpy.arcsinh 反双曲正弦
numpy.asinh 反双曲正弦
numpy.arccosh 反双曲余弦
numpy.acosh 反双曲余弦
numpy.arctanh 反双曲正切
numpy.atanh 反双曲正切
四舍五入
numpy.round 将数组四舍五入到给定的小数位数
numpy.around 将数组四舍五入到给定的小数位数
numpy.rint 将数组元素四舍五入到最近的整数
numpy.fix 向零方向舍入到最近的整数
numpy.floor 向下取整
numpy.ceil 向上取整
numpy.trunc 截断
和、积、差
numpy.prod 乘积
numpy.sum 总和
numpy.nanprod 乘积,将非数字 (NaNs) 视为一
numpy.nansum 总和,将非数字 (NaNs) 视为零
numpy.cumulative_sum 累积和
numpy.cumulative_prod 累积积
numpy.cumprod 累积积
numpy.cumsum 累积和
numpy.nancumprod 累积积,将非数字 (NaNs) 视为一
numpy.nancumsum 累积和,将非数字 (NaNs) 视为零
numpy.diff 离散差分
numpy.ediff1d 连续元素之间的差值
numpy.gradient 梯度
numpy.cross 叉积
numpy.trapezoid 使用复合梯形法则沿给定轴进行积分
指数和对数
numpy.exp 指数
numpy.log 自然对数
……
算术运算
numpy.add 相加
numpy.reciprocal 倒数
numpy.positive 正值
numpy.negative 负值
numpy.multiply 相乘
numpy.divide 相除
numpy.power 底数的指数的幂
numpy.pow 底数的指数的幂
numpy.subtract 相减
numpy.true_divide 相除
numpy.floor_divide 最大整数
numpy.float_power 底数的指数的幂
numpy.fmod 余数
numpy.mod 余数
numpy.modf 小数部分和整数部分
numpy.remainder 余数
numpy.divmod 商和余数
……
……

统计函数

顺序统计
numpy.ptp 最大值与最小值的差(最大值-最小值)
numpy.percentile 表示小于这个值的观察值的百分比
numpy.nanpercentile 表示小于这个值的观察值的百分比,同时忽略NaN值
numpy.quantile 分位数
numpy.nanquantile 分位数,同时忽略NaN值
平均值和方差
numpy.median 中位数
numpy.average 加权平均值
numpy.mean 算术平均值
numpy.std 标准差
numpy.var 方差
numpy.nanmedian 中位数,同时忽略NaN值
numpy.nanmean 算术平均值,忽略NaN值
numpy.nanstd 标准差,同时忽略NaN值
numpy.nanvar 方差,同时忽略NaN值
相关性
numpy.corrcoef 皮尔逊积矩相关系数
numpy.correlate 两个一维序列的互相关
numpy.cov 根据数据和权重估计协方差矩阵
直方图
numpy.histogram 直方图
numpy.histogram2d 二维直方图
numpy.histogramdd 多维直方图
numpy.bincount 计算非负整数数组中每个值的出现次数
……

其他

还有好多其他函数,比如日期时间,离散傅里叶变换,输入和输出,线性代数,窗口函数等等,这里就不一一列举了。