CAN/CANFD
CCP/UDS
Bootloader/OTA
ECU/VCU/FCU
Simulink/ECUCoder
Ethernet
Hardware
Download
上一篇
下一篇
NumPy快速参考手册
一.创建数组
二.数组的属性
三.数组的索引
四.基本数学运算
五.基本数学函数
六.统计类函数
七.比较类函数
八.排序与去重函数
九.线性代数运算
十.文件存取
十一.修改数组形状
十二.数组元素的添加与删除
十三.其它功能函数
十四.Matplotlib绘图
十五.版本兼容性
回到顶部
NumPy快速参考手册
一.创建数组
二.数组的属性
三.数组的索引
四.基本数学运算
五.基本数学函数
六.统计类函数
七.比较类函数
八.排序与去重函数
九.线性代数运算
十.文件存取
十一.修改数组形状
十二.数组元素的添加与删除
十三.其它功能函数
十四.Matplotlib绘图
十五.版本兼容性
回到顶部
# NumPy快速参考手册 NumPy(Numerical Python) 是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 安装NumPy: ```shell pip install numpy ``` 上述命令安装的是最新版本的NumPy,如果需要安装指定版本的NumPy: ```shell pip install numpy==1.26.1 ``` 验证NumPy是否已经正常安装: ```python import numpy as np print(np.__version__) ``` 运行上述代码会打印当前已安装NumPy的版本,比如1.26.1。 ## 一.创建数组
NumPy的核心数据结构是多维数组ndarray,本文后续将多维数组ndarray简称为数组。NumPy创建数组常用三类方法,第一类是使用np.array()函数基于Python对象(通常为列表)来创建数组: ```python import numpy as np #基于Python对象构建多维数组 a1 = np.array([3, 4, 5], dtype='int') print(a1) a2 = np.array([[3, 4, 5],[6, 7, 8]]) print(a2) a3 = np.copy(a2) print(a3) ``` 创建数组时可以使用dtype参数指定数组元素的数据类型。当需要复制一个新数组时,使用np.copy()即可。 创建数组的第二类方法是基于有规律的数据序列来构建数组,使用到的函数包括np.arange()、np.linspace()、np.logspace()等: ```python #基于有规律的数据序列构建多维数组 a0 = np.arange(8) # 终止值 print(a0) a1 = np.arange(10, 21) # 起始值、终止值 print(a1) a2 = np.arange(0, 100, 10) # 起始值、终止值、步长 print(a2) a3 = np.linspace(10, 50, 5) # 起始值、终止值、个数 print(a3) a4 = np.logspace(0, 5, 6) print(a4) ``` 使用np.arange()函数时,如果只给1个参数则该参数是终止值(此时起始值默认为0,步长默认为1),如果给2个参数则参数依次是起始值与终止值,如果给3个参数则参数依次是起始值、终止值与步长。 使用np.linspace()函数与np.logspace()函数时,至少需要两个参数:起始值与终止值。可以指定元素个数num,如果不指定元素个数时,默认为50。 创建数组的第三类方法是利用NumPy提供的函数来创建各类特殊数组: ```python a1 = np.zeros((3,4), dtype='int') #3行4列全0矩阵 print(a1) a2 = np.ones((2,3), dtype='int') #全1矩阵 print(a2) a3 = np.empty((3,2)) #未初始化矩阵 print(a3) a4 = np.full((3,3),8) #单值矩阵 print(a4) a5 = np.eye(3,dtype='int') #单位矩阵 print(a5) a6 = np.diag([6,7,8,9]) #对角矩阵 print(a6) a7 = np.random.rand(3, 2) #3行2列矩阵,元素值为0,1之间的随机值 print(a7) a8 = np.random.uniform(1.0, 10.0, (3,3)) #3行3列矩阵,元素值为1,10之间的随机小数 print(a8) a9 = np.random.randint(10, 50, (2,5)) #2行5列矩阵,元素值为10,50之间的随机整数 print(a9) ``` np.zeros()用于创建全0数组,np.ones()用于创建全1数组,使用这两个函数时都需要指定数组的形状(shape)。np.zeros_like()也用于创建全0数组,np.ones_like()也用于创建全1数组,使用这两个函数时需要一个已有数组作为形状(shape)的范本: ```python a90 = np.zeros_like(a9) print(a90) a91 = np.ones_like(a9) print(a91) ``` 全0数组a90、全1数组a91的形状(shape)与数组a9一致。 ## 二.数组的属性
数组的常用属性包括: - shape:形状,对于矩阵,就是行数与列数。 - ndim:维度数量或轴的数量,对于矩阵是2。 - size:数组中元素的总个数。 - dtype:数组中元素的数据类型。 - T:矩阵的转置。 - itemsize:数组中每个元素的大小,以字节为单位。 ```python print(a9.shape) print(a9.ndim) print(a9.size) print(a9.dtype) print(a9.T) print(a9.itemsize) ``` NumPy支持的数据比较丰富,比如int(包括int、int8、int16、int32、int64等),uint(包括uint8、uint16、uint32、uint64等),float(包括float、float16、float32、float64等),complex(包括complex、complex64、complex128等),bool等。 ## 三.数组的索引
NumPy多维数组支持Python列表的索引方式,并且还支持布尔索引方式,即利用布尔条件判断来索引符合布尔条件的元素: ```python a1 = np.random.randint(1, 100, 15) print(a1) print(a1[0], a1[-1]) print(a1[0:3]) print(a1[10:]) # 索引位号10以后的所有元素 print(a1[a1 > 40]) # 索引所有大于40的元素 print(a1[(a1 > 40) & (a1 < 80)]) # 索引所有大于40并且小于80的元素 print('反转数组:\n', a1[::-1]) # 反转数组 print('*' * 25, '二维数组的索引', '*' * 25) a2 = np.random.randint(1, 100, (3, 5)) print(a2) print(a2[0, :]) print(a2[2, 1:3]) print(a2[a2 > 50]) print(a2[(a2 > 40) & (a2 < 80)]) # 索引所有大于40并且小于80的元素 print(a2[2][a2[2] > 20]) # 索引行2中所有大于40的元素 print('反转数组:\n', a2[:, ::-1]) # 反转数组 ``` 需要注意的是,在NumPy布尔索引中需要使用&而不是and,&对数组中的每个元素执行与操作。在布尔数组中,它等价于逻辑与操作,但适用于整个数组的元素。如果使用and,Python会尝试将整个数组视为一个单一的布尔值,这会导致ValueError。 布尔索引方式可以非常方便地批量操作数组元素: ```python a2[a2 > 50] = 0 # 将所有大于50的元素设置为0 print(a2) ``` 另一种功能强大的索引是花式索引,花式索引指的是利用整数数组进行索引,花式索引可以同时选择数组中的多个指定元素: ```python print('花式索引:',a1[[0, 3, 5]]) # 索引a1中位号0、3、5的元素 ``` ## 四.基本数学运算
NumPy多维数组之间的加减乘除基本数学运算都是数组元素对元素之间的加减乘除基本数学运算: ```python a1 = np.array([2, 3, 4, 5, 6]) a2 = np.array([0, 1, 2, 3, 4]) print(a1 + a2) print(a1 - a2) print(a1 * a2) print(a2 / a1) print(a2 % a1) ``` NumPy数组支持广播机制,当两个形状不一样的数组参与运算时,维度较小的数组会自动增加维度(称为广播机制)满足运算要求: ```python a1 = np.array([2, 3, 4, 5, 6]) a3 = np.array([[10, 10, 10, 10, 10], [20, 20, 20, 20, 20]]) print(a1 * 2) # 单元素2广播为[2, 2, 2, 2, 2]之后再运算 print(a1 + a3) # a1广播为两行之后再运算 ``` ## 五.基本数学函数
NumPy提供了大量数学函数用于数学运算: ```python print(np.sqrt(a1)) # 求平方根 print(np.exp(a1)) # 求自然指数 print(np.log(a1)) # 求对数 print(np.sin(np.pi / 2)) # 求正弦 print(np.cos(np.pi / 2)) # 求余弦 a2 = np.array([-2, 2, 4]) print(np.abs(a2)) # 求绝对值 print(np.power(a2, 2)) # 求幂 a3 = np.array([-1.2, 1.5, 3.14, 10.01, np.nan]) print(np.round(a3)) # 四舍五入 print(np.ceil(a3)) # 向上取整 print(np.floor(a3)) # 向下取整 print(np.isnan(a3)) # 判断是否nan ``` ## 六.统计类函数
NumPy提供了大量统计类函数用于数学统计: ```python print('最大值:', np.max(a4)) print('最大值的索引:', np.argmax(a4)) print('最小值:', np.min(a4)) print('最小值的索引:', np.argmin(a4)) print('求和:', np.sum(a4)) print('均值:', np.mean(a4)) print('中位数:', np.median(a4)) print('较小10%分位数:', np.percentile(a4, 10)) print('标准差:', np.std(a4)) print('方差:', np.var(a4)) ``` 对于多维数组,比如矩阵,上述统计类函数默认统计整个矩阵的所有元素,用户可以通过指定参数axis来指定按行统计(axis=1)或者按列统计(axis=0)。 ## 七.比较类函数
NumPy提供了大量比较类函数用于比较: ```python a1 = np.array([2, 3, 4, 5, 6]) a2 = np.array([0, 1, 2, 3, 4]) print(np.logical_and(a1, a2)) # 逻辑与 print(np.logical_or(a1, a2)) # 逻辑或 print(np.logical_not(a2)) # 逻辑非 print(np.any(a2)) # 检查是否有任一元素为True print(np.all(a2)) # 检查是否所有元素为True a5 = np.random.randint(1, 100, 20) print(np.greater(a5, 50)) # 大于 print(np.less(a5, 50)) # 小于 print(np.equal(a5, 50)) # 等于 print(np.where(a5 >= 60, '合格', '不合格')) print(np.select([a5 < 60, (a5 >= 60) & (a5 < 85), a5 > 85], ['不及格', '及格', '优秀'], default='未知')) ``` np.where()函数通常用于将数据进行二分类或者部分替换,np.select()函数通常用于将数据进行多分类或者替换,因为np.select()函数设置分类条件更加方便一些。 ## 八.排序与去重函数
NumPy提供了几个函数用于排序与去重: ```python print(np.sort(a5)) # 排序 print(np.unique(a5)) # 排序并去重 ``` np.unique()函数在排序的同时还会将数组中的重复数据删除,np.unique()函数除了返回排序并去重的数组之外,还可以返回各个元素出现的次数(需指定参数return_counts为True)。 ## 九.线性代数运算
NumPy提供了几个函数用于线性代数运算: ```python a1 = np.array([[1, 2], [3, 4]]) a2 = np.array([[11, 12], [13, 14]]) print(np.dot(a1, a2)) # 计算点积 print(np.matmul(a1, a2)) # 计算矩阵乘积 print(np.linalg.det(a1)) # 计算矩阵的行列式 print(np.linalg.inv(a1)) # 计算矩阵的逆矩阵 ``` np.dot() 对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为向量点积);对于二维数组,计算的是两个数组的矩阵乘积。 np.matmul() 通常用于矩阵乘积,通常情况下计算结果与np.dot()的计算结果相同。 ## 十.文件存取
NumPy提供了文件存取的完整功能,用户不需要指定编码方式,也不需要使用with管理资源,直接使用NumPy提供的save()函数即可将数据保存成文件,使用load()函数即可从文件导入数据: ```python np.save('a1.npy', a1) a1load = np.load('a1.npy') print(a1load) ``` ## 十一.修改数组形状
NumPy提供了几个函数用于修改数组形状: | 函数 | 描述 | | ----------- | ------------------------- | | x.reshape() | 不改变数据的条件下修改形状,与原始数组共享内存 | | x.flatten() | 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组 | | x.ravel() | 返回展开数组,与原始数组共享内存 | 修改数组形状示例: ```python a1 = np.arange(10, 20, 1) print(a1) print(a1.reshape(2, 5)) a2 = a1.reshape(2, 5) print(a2) a3 = a2.flatten() # 展平数组并创建一个新的拷贝 a3[0] = 88 print('修改flatten:', a3) print(a2) print(a1) a4 = a2.ravel() # 展平数组但与原数组共享内存 a4[0] = 66 print('修改ravel:', a4) print(a2) print(a1) ``` reshape()只修改形状,与原始数组共享内存。flatten()与ravel()都展平数组,但是flatten()创建一个新的拷贝,修改展平数组不会影响原始数组。而ravel()与原始数组共享内存,修改展平数组会同步影响原始数组。 ## 十二.数组元素的添加与删除
NumPy提供了几个函数用于数组元素的添加与删除: | 函数 | 描述 | | ----------- | -------------------- | | np.append() | 将值添加到数组末尾 | | np.insert() | 沿指定轴将值插入到指定下标之前 | | np.delete() | 删掉某个轴的子数组,并返回删除后的新数组 | np.append()函数在数组的末尾添加值。追加操作会分配整个数组,并把原来的数组复制到新数组中。 此外,输入数组的维度必须匹配否则将生成ValueError。 ```python np.append(arr, values, axis=None) ``` - arr:输入数组 - values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)。 - axis:默认为None。当axis无定义时,是横向加成,返回总是为一维数组!当axis为0时,数组添加新元素后行增加,列不变。当axis为1时,数组添加新元素后列增加,行不变。 ```python a = np.array([[1,2,3],[4,5,6]]) print('第一个数组:') print(a) print('向数组添加元素:') print(np.append(a, [7,8,9])) print ('沿轴0添加元素:') print (np.append(a, [[7,8,9]],axis = 0)) # 行增加,列不变 print ('沿轴1添加元素:') print (np.append(a, [[5,5,5],[7,8,9]],axis = 1)) # 列增加,行不变 ``` np.insert()函数在给定索引之前,沿给定轴在输入数组中插入值。 函数会在指定位置插入给定的值或数组,然后返回新的数组。被插入的元素可以是标量值,也可以是数组。需要注意的是,插入操作会返回一个新的数组,而不会改变原始数组。 ```python np.insert(arr, obj, values, axis) ``` - arr:输入数组 - obj:在其之前插入值的索引 - values:要插入的值 - axis:沿着它插入的轴,如果未提供,则返回一维数组。当axis为0时,返回的数组插入新元素后行增加,列不变。当axis为1时,返回的数组插入新元素后列增加,行不变。 ```python a = np.array([[1, 2], [3, 4], [5, 6]]) print('第一个数组:') print(a) print('未传递Axis参数。 在删除之前输入数组会被展开。') print(np.insert(a, 3, [11, 12])) print('传递了Axis参数。 会广播值数组来配输入数组。') print('沿轴0广播:') print(np.insert(a, 1, 8, axis=0)) # 行增加,列不变 print('沿轴1广播:') print(np.insert(a, 1, 66, axis=1)) # 列增加,行不变 ``` np.delete()函数返回从输入数组中删除指定子数组的新数组。 与np.insert()函数的情况一样,如果未提供轴参数,则输入数组将展开。 ```python np.delete(arr, obj, axis) ``` - arr:输入数组 - obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组。 - axis:沿着它删除给定子数组的轴,如果未提供,则返回一维数组。当axis为0时,返回的数组删除了指定行,列数不变。当axis为1时,返回的数组删除了指定列,行数不变。 ```python a = np.arange(10, 20, 1).reshape(2, 5) print('第一个数组:') print(a) print('未传递 Axis 参数。 在删除之前输入数组会被展开。') print(np.delete(a, 5)) print('删除第二行:') print(np.delete(a, 1, axis=0)) # 行删除,列数不变 print('删除第二列:') print(np.delete(a, 1, axis=1)) # 列删除,行数不变 ``` ## 十三.其它功能函数
除了以上几类函数之外,NumPy还提供了几个有用的其它功能函数: ```python print(np.concatenate((a1, a2)) # 拼接两个数组 print(np.split(a5, 4)) # 切割数组 ``` np.concatenate()函数通常用于拼接形状相同的数组,在拼接时可以通过参数axis指定沿着行拼接(行数增加,列数不变)或者沿着列拼接(行数不变,列数增加)。 np.split()函数切割数组时需要注意指定的切割份数必须可以被数组中元素的总个数整除,否则会报错。 ## 十四.Matplotlib绘图
Matplotlib 是 Python 的绘图库,使用前需要先安装: ```shell pip install matplotlib ``` 使用matplotlib非常简单: ```python import numpy as np from matplotlib import pyplot as plt x = np.arange(1,11) y = 2 * x + 5 plt.title("Matplotlib demo") # 设置图片标题 plt.xlabel("x axis caption") # 设置X轴标签 plt.ylabel("y axis caption") # 设置Y轴标签 plt.plot(x,y) # 绘图 plt.show() # 显示图片 ``` 在使用plot()函数时,可以同时指定绘图的线型与颜色: ```python plt.plot(x, y, '*r') #设置线型:星形标记,红色 ``` 支持的常见线型如下表: | 字符 | 线型描述 | | ---- | ----- | | '-' | 实线样式 | | '--' | 短横线样式 | | '-.' | 点划线样式 | | ':' | 虚线样式 | | '.' | 点标记 | | 's' | 正方形标记 | | 'v' | 三角形标记 | | '*' | 星形标记 | | '+' | 加号标记 | 支持的常见颜色如下表: | 字符 | 颜色描述 | | --- | ---- | | 'r' | 红色 | | 'g' | 绿色 | | 'b' | 蓝色 | | 'y' | 黄色 | | 'k' | 黑色 | | 'w' | 白色 | subplot()函数可用于在各个分块位置创建坐标区,适用于相似图对比。 ```python x = np.arange(0, 11, 0.5) y1 = 2 * x + 5 y2 = np.sin(x) plt.title("Matplotlib demo") plt.xlabel("x axis caption") plt.ylabel("y axis caption") plt.subplot(2, 1, 1) # 以2*1方式创建2个坐标区并在坐标区1绘图 plt.plot(x, y1) plt.subplot(2, 1, 2) # 在坐标区2绘图 plt.plot(x, y2, 'vr') plt.show() ``` 详细的Matplotlib绘图可以参考[Matplotlib 教程 | 菜鸟教程](https://www.runoob.com/matplotlib/matplotlib-tutorial.html)。 ## 十五.版本兼容性
NumPy的2.x(2.0版本发布于2024年6月16日)版本与1.x版本存在一定的兼容性问题,在运行某些软件(比如PyTorch v2.3.0)时,可能会报错,此时,需要安装特定版本的NumPy而不是安装最新版本的NumPy。查看可安装的NumPy版本: ```shell pip index versions numpy ``` 此时会列出所有可安装的NumPy版本,比如2.2.6,1.26.0,1.26.1等等。 卸载已经安装的NumPy: ```shell pip uninstall numpy ``` 安装特定版本的NumPy: ```shell pip install numpy==1.26.1 ```