ufunc
函数
ufunc
函数即通用函数(universal function
),是一种能够对数组中的所有元素进行操作的函数。ufunc
函数是针对数组进行操作的,并且都以NumPy
数组作为输出,因此不需要对数组的每一个元素都进行操作。对一个数组进行重复运算时,使用ufunc
函数比使用math
库中的函数效率要高很多。
1. 常用的ufunc函数运算
常用的ufunc
函数运算有四则运算、比较运算和逻辑运算等。
1.1 四则运算
ufunc
函数支持全部的四则运算,并且保留习惯的运算符,和数值运算的使用方式一样(原理即运算符重载,比如列表+
运算),但是需要注意的是,操作的对象是数组。数组间的四则运算表示对每个数组中的元素分别进行四则运算,所以进行四则运算的两个数组的形状必须相同。
案例:数组四则运算
x = np.array([1,2,3])
y = np.array([4,5,6])
print('数组相加结果为:',x + y) #数组相加
print('数组相减结果为:',x - y) #数组相减
print('数组相乘结果为:',x * y) #数组相乘
print('数组相除结果为:',x / y) #数组相除
print('数组幂运算结果为:',x ** y) #数组幂运算
数组相加结果为: [5 7 9]
数组相减结果为: [-3 -3 -3]
数组相乘结果为: [ 4 10 18]
数组相除结果为: [0.25 0.4 0.5 ]
数组幂运算结果为: [ 1 32 729]
1.2 比较运算
ufunc
中也可以用完整的比较运算:>
、<
、==
、>=
、<=
、!=
。
比较运算返回的结果是一个布尔数组,其每个元素为数组对应元素的比较结果。
案例:数组比较运算
x = np.array([1,3,5])
y = np.array([2,3,4])
print('数组比较结果为:',x < y)
print('数组比较结果为:',x > y)
print('数组比较结果为:',x == y)
print('数组比较结果为:',x >= y)
print('数组比较结果为:',x <= y)
print('数组比较结果为:',x != y)
数组比较结果为: [ True False False]
数组比较结果为: [False False True]
数组比较结果为: [False True False]
数组比较结果为: [False True True]
数组比较结果为: [ True True False]
数组比较结果为: [ True False True]
1.3 数组逻辑运算
在NumPy逻辑运算中,np.all
函数表示逻辑and
,np.any
函数表示逻辑or
。
案例:数组逻辑运算
#np.all()表示逻辑and,对矩阵所有元素做与操作,所有为True则返回True
print('数组逻辑运算结果为:',np.all(x == y))
#np.any()表示逻辑or,对矩阵所有元素做或运算,存在True则返回True
print('数组逻辑运算结果为:',np.any(x == y))
数组逻辑运算结果为: False
数组逻辑运算结果为: True
2. ufunc函数的广播机制
广播(Broadcasting)是指不同形状的数组之间执行算术运算的方式。
当使用ufunc函数进行数组计算时,ufunc函数会对两个数组的对应元素进行计算。进行这种计算的前提是两个数组的shape一致。若两个数组的shape不一致,则NumPy会实行广播机制。NumPy中的广播机制并不容易理解,特别是在进行高维数组计算的时候。为了更好地使用广播机制,需要遵循4个原则。
- (1)让所有的输入数组向其中shape最长的数组看齐,shape中不足的部分通过在前面加1补齐。
- (2)输出数组的shape是输入数组shape的各个轴上的最大值。
- (3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为 1,则这个数组能够用来计算,否则出错。
- (4)当输入数组的某个轴的长度为1时,沿着此轴运算时使用此轴上的第一组值。
案例:演示一维数组的广播机制
arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
print('创建的数组1为:\n',arr1)
print('数组1的shape为:',arr1.shape)
arr2 = np.array([1,2,3])
print('创建的数组2为:\n',arr2)
print('数组2的shape为:',arr2.shape)
print('数组相加结果为:\n',arr1 + arr2)
创建的数组1为:
[[0 0 0]
[1 1 1]
[2 2 2]
[3 3 3]]
数组1的shape为: (4, 3)
创建的数组2为:
[1 2 3]
数组2的shape为: (3,)
数组相加结果为:
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
案例:演示二维数组的广播机制
arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]])
print('创建的数组1为:\n',arr1)
print('数组1的shape为:',arr1.shape)
arr2 = np.array([1,2,3,4]).reshape((4,1))
print('创建的数组2为:\n',arr2)
print('数组2的shape为:',arr2.shape)
print('数组相加结果为:\n',arr1 + arr2)
创建的数组1为:
[[0 0 0]
[1 1 1]
[2 2 2]
[3 3 3]]
数组1的shape为: (4, 3)
创建的数组2为:
[[1]
[2]
[3]
[4]]
数组2的shape为: (4, 1)
数组相加结果为:
[[1 1 1]
[3 3 3]
[5 5 5]
[7 7 7]]