NumPy中的形状维度尺度计算、算术与矩阵运算、统计运算、差分和累计运算、排序与索引运算、布尔运算等的使用方法和程序举例
目录
在之前的博文中介绍了Numpy多维数组的生成(链接: 使用NumPy工具包生成一维、二维以及多维数组方法和具体举例)和Numpy数组的任意切片方法(链接: Numpy数据中的行切片、列切片以及行列结合的数据切片方法及具体代码举例)内容,本节介绍了Numpy使用中的常用运算,重点将对NumPy中的形状维度尺度计算、算术与矩阵运算、统计运算、差分和累计运算、排序与索引运算、布尔运算等进行了介绍。
之前的本博主写的有关Numpy的文章:
博文1: 使用NumPy工具包生成一维、二维以及多维数组方法和具体举例;
博文2:Numpy数据中的行切片、列切片以及行列结合的数据切片方法及具体代码举例;
博文3:numpy.reshape的语法参数介绍和用法举例。
1.Numpy形状、维度、长度计算
1.1 计算数组的形状计算——A1.shape
NumPy数组A1的shape属性是整数的元组。每个整数表示所对应轴的元素数量。
例子:
import numpy as np
A1=np.array([[2,0,2,5],[0,6,2,7],[1,5,4,5]])
print(A1)
A1.shape #计算形状
print('A1的形状是',A1.shape)
运行结果:
[[2 0 2 5]
[0 6 2 7]
[1 5 4 5]]
A1的形状是 (3, 4)
1.2 计算数组维度计算——A1.ndim
维度ndim属性等于形状元组的长度。即:A1.ndim=len(A1.shape)
import numpy as np
A1=np.array([[2,0,2,5],[0,6,2,7],[1,5,4,5]])
print(A1)
A1.ndim # 计算维度
print('A1是一个',A1.ndim,'个维度的数组!')
运行结果:
[[2 0 2 5]
[0 6 2 7]
[1 5 4 5]]
A1是一个 2 个维度的数组!
len(A1.shape)
运行结果:
2
1.3 计算数组长度计算——A1.size或np.size()
(1)计算整个数组长度
import numpy as np
A1=np.array([[2,0,2,5],[0,6,2,7],[1,5,4,5]])
print(A1)
A1.size # 元素数量
print('A1是一个具有',A1.size,'个元素的数组!')
运行结果:
[[2 0 2 5]
[0 6 2 7]
[1 5 4 5]]
A1是一个具有 12 个元素的数组!
(2)计算数组的行数——采用np.size(A1,0)
import numpy as np
A1=np.array([[2,0,2,5],[0,6,2,7],[1,5,4,5]])
print(A1)
np.size(A1,0) # 求行数
print('A1是一个',np.size(A1,0),'行的数组!')
运行结果:
[[2 0 2 5]
[0 6 2 7]
[1 5 4 5]]
A1是一个 3 行的数组!
(3)计算数组的列数——采用np.size(A1,1)
import numpy as np
A1=np.array([[2,0,2,5],[0,6,2,7],[1,5,4,5]])
print(A1)
np.size(A1,1) # 求列数
print('A1是一个',np.size(A1,1),'列的数组!')
运行结果:
[[2 0 2 5]
[0 6 2 7]
[1 5 4 5]]
A1是一个 4 列的数组!
2.基本运算
2.1 加减运算
import numpy as np
A2=np.array([[1,3,5,7],[2,4,6,8]])
B2=np.array([[1,0,1,0],[-1,0,-1,0]])
print('A2+B2=',A2+B2) # 对应元素相加
print('A2-B2=',A2-B2) # 对应元素相减
运行结果:
A2+B2= [[2 3 6 7]
[1 4 5 8]]
A2-B2= [[0 3 4 7]
[3 4 7 8]]
2.2 数组对应元素乘法和除法、取余运算
(1) Hadamard积——对应元素相乘
星号*执行Hadamard积,即将两个形状相等的矩阵对应元素相乘。
import numpy as np
A2=np.array([[1,3,5,7],[2,4,6,8]])
B2=np.array([[1,0,1,0],[-1,0,-1,0]])
print('A2*B2=',A2*B2) # 对应元素相乘
运行结果:
A2*B2= [[ 1 0 5 0]
[-2 0 -6 0]]
(2) 对应元素除法
import numpy as np
A2=np.array([[1,3,5,7],[2,4,6,8]])
B2=np.array([[1,0,1,0],[-1,0,-1,0]])
print('B2/A2=',B2/A2) # 对应元素相除
运行结果:
B2/A2= [[ 1. 0. 0.2 0. ]
[-0.5 0. -0.16666667 0. ]]
(3) 对应元素取余
import numpy as np
A22=np.array([[1,3,5,7],[2,4,6,8]])
B22=np.array([[1,0,1,0],[5,7,11,15]])
print(B22%A22) #对应元素取余运算
运行结果:
[[0 0 1 0]
[1 3 5 7]]
2.3 矩阵乘法——使用@ 或者np.matmul(A,B)
import numpy as np
A3=np.array([[1,3],[2,4]])
B3=np.array([[1,0],[-1,0]])
A3@B3 #矩阵乘法,等价于np.matmul(A3,B3)
运行结果(也如图1运行结果):
array([[-2, 0],
[-2, 0]])
np.matmul(A3,B3) #矩阵乘法,等价于A3@B3
运行结果(也如图1运行结果):
array([[-2, 0],
[-2, 0]])

图1 Numpy中数组的矩阵乘法运算
3. 产生特殊数组运算
3.1 给定步长产生均匀等间隔一维度的numpy数组——np.arrange(start,stop,step)
creates a new 1D numpy array with evenly spaced values
创建具有均匀间隔值的新1D numpy数组.
import numpy as np
A4=np.arange(2,19,4)
print('A4=',A4)
运行结果:
A4= [ 2 6 10 14 18]
3.2 给定数量产生均匀等间隔一维度的numpy数组——np.linspace(start,stop,num)
import numpy as np
A5=np.linspace(2,19,4)
print('A5=',A5)
运行结果:
A5= [ 2. 7.66666667 13.33333333 19. ]
4.统计运算
4.1 求整个数组的最小值和最大值
import numpy as np
A6=np.arange(10,100,10).reshape(3,3)
print(A6)
print('{0}为整个矩阵中最小'.format(A6.min()))
print('{0}为整个矩阵中最大'.format(A6.max()))
运行结果:
[[10 20 30]
[40 50 60]
[70 80 90]]
10为整个矩阵中最小
90为整个矩阵中最大
4.2 求均值
import numpy as np
A6=np.arange(10,100,10).reshape(3,3)
print(A6)
print('{0}为整个矩阵的均值'.format(A6.mean()))
print('{0}为整个矩阵的均值'.format(np.average(A6)))
运行结果:
[[10 20 30]
[40 50 60]
[70 80 90]]
50.0为整个矩阵的均值
50.0为整个矩阵的均值
4.3 求标准差和方差
import numpy as np
A6=np.arange(10,100,10).reshape(3,3)
print(A6)
print('{0}为整个矩阵中标准差'.format(A6.std()))
print('{0}为整个矩阵中方差'.format(A6.var()))
运行结果:
[[10 20 30]
[40 50 60]
[70 80 90]]
25.81988897471611为整个矩阵中标准差
666.6666666666666为整个矩阵中方差
4.4 求每列或每行的最大值或最小值
(1)求每列最大值或最小值
import numpy as np
A6=np.arange(10,100,10).reshape(3,3)
print(A6)
print('{0}为每列中的最小值'.format(A6.min(axis=0)))
print('{0}为每列中的最大值'.format(A6.max(axis=0)))
运行结果:
[[10 20 30]
[40 50 60]
[70 80 90]]
[10 20 30]为每列中的最小值
[70 80 90]为每列中的最大值
(2)求每行最大值或最小值
import numpy as np
A6=np.arange(10,100,10).reshape(3,3)
print(A6)
print('{0}为每行中的最小值'.format(A6.min(axis=1)))
print('{0}为每行中的最大值'.format(A6.max(axis=1)))
运行结果:
[[10 20 30]
[40 50 60]
[70 80 90]]
[10 40 70]为每行中的最小值
[30 60 90]为每行中的最大值
5. 差分和累加计算
5.1 差分计算——np.diff(A)
import numpy as np
A7=np.array([[10,3,15,7],[21,43,66,8]])
A8=np.diff(A7)
print('A8=',A8)
运行结果:
A8= [[ -7 12 -8]
[ 22 23 -58]]
5.2 差加计算——np.cumsum(A)
import numpy as np
A7=np.array([[10,3,15,7],[21,43,66,8]])
A9=np.cumsum(A7)
print('A9=',A9)
运行结果:
A9= [ 10 13 28 35 56 99 165 173]
6. 升序排序运算
例子:给数组进行升序排序
import numpy as np
A7=np.array([[10,3,15,7],[21,43,66,8]])
A10=np.sort(A7)
print('A10=',A10)
运行结果:
A10= [[ 3 7 10 15]
[ 8 21 43 66]]
7.索引求解
7.1 数组进行升序排序前的索引求解
import numpy as np
A7=np.array([[10,3,15,7],[21,43,66,8]])
print(A7)
index1=np.argsort(A7)
print('index1=',index1)
运行结果:
[[10 3 15 7]
[21 43 66 8]]
index1= [[1 3 0 2]
[3 0 1 2]]
7.2 整个数组最大值位置的索引求解
import numpy as np
A7=np.array([[10,3,15,7],[21,43,66,8]])
print(A7)
index2=np.argmax(A7)
print('index2=',index2)
运行结果:
[[10 3 15 7]
[21 43 66 8]]
index2= 6
7.3 整个数组中非零元素位置索引求解
import numpy as np
A11=np.array([[0,0,15,7],[0,0,0,8]])
print(A7)
index3=np.nonzero(A7)
print('index3=',index3)
运行结果:
[[10 3 15 7]
[21 43 66 8]]
index3= (array([0, 0, 0, 0, 1, 1, 1, 1]), array([0, 1, 2, 3, 0, 1, 2, 3]))
8.布尔运算
8.1 比较大小运算
import numpy as np
A12=np.arange(0,10)
print('A12=',A12)
A13=A12>4
print('A13=',A13)
运行结果:
A12= [0 1 2 3 4 5 6 7 8 9]
A13= [False False False False False True True True True True]
8.2 位或运算——采用A|B
import numpy as np
A12=np.arange(0,10)
print('A12=',A12)
A14=(A12>4)|(A12<2) # 注意此处不能使用A14=(A12>4) or (A12<2) 否则报错
print('A14=',A14)
运行结果:
A12= [0 1 2 3 4 5 6 7 8 9]
A14= [ True True False False False True True True True True]
8.3 位与运算——采用A&B
import numpy as np
A12=np.arange(0,10)
print('A12=',A12)
A15=(A12>4)&(A12<7)
print('A15=',A15)
运行结果:
A12= [0 1 2 3 4 5 6 7 8 9]
A15= [False False False False False True True False False False]
8.4 位非运算——采用~A
import numpy as np
A12=np.arange(0,10)
print('A12=',A12)
A15=(A12>4)&(A12<7)
print('A15=',A15)
A16=~A15 #此处不能使用 not A15
print('A16=',A16)
运行结果:
A12= [0 1 2 3 4 5 6 7 8 9]
A15= [False False False False False True True False False False]
A16= [ True True True True True False False True True True]
8.5 位异或运算——采用A^B
import numpy as np
A12=np.arange(0,10)
print('A12=',A12)
A15=(A12>4)&(A12<7)
print('A15=',A15)
A16=~A15 #此处不能使用 not A15
print('A16=',A16)
A17=A15 ^ A16 # 此处等价于 A15 != A16
print('A17=',A17)
运行结果:
A12= [0 1 2 3 4 5 6 7 8 9]
A15= [False False False False False True True False False False]
A16= [ True True True True True False False True True True]
A17= [ True True True True True True True True True True]
A18=A15 != A16 # 此处等价于 A15 ^ A16
print('A18=',A18)
运行结果:
A18= [ True True True True True True True True True True]
8.6 逻辑异或运算——采用A != B
A19=np.array([9,8,7,6,5,4,3,2,1,0])
A19 ^ A12 # 逐个元素转换成二进制进行位与运算
运行结果:
array([9, 9, 5, 5, 1, 1, 5, 5, 9, 9])
A19 != A12 # 逐个元素进行位与运算 此时的A19 ^ A12 与A19 != A12不等效。
运行结果:
array([ True, True, True, True, True, True, True, True, True,
True])
注意:位逻辑运算时候,参与运算的数组的元素要是整数或逻辑值Ture或False,而不能是小数等其他值。
9. 总结
在之前的博文中介绍了Numpy数组的生成和Numpy数组的切片内容,本节介绍了Numpy使用中的常用运算,重点对NumPy中的形状维度尺度计算、算术与矩阵运算、统计运算、差分和累计运算、排序与索引运算、布尔运算等进行了介绍,以加深对NumPy工具包的熟练使用。

被折叠的 条评论
为什么被折叠?



