```NumPy数组的算术运算使用了广播(broadcasting)机制,它允许不同形状的数组进行元素级别的运算,而无需显式地扩展数组的形状。这个功能使得在处理不同维度的数组时更加方便和灵活。
广播的规则如下:
1. 如果两个数组的维度不同,那么将维度较小的数组在其前面补1,使得两个数组的维度一致。
2. 如果两个数组的维度在任何一个维度上都不匹配,且维度不同的数组的长度不为1,则报错。
3. 如果两个数组的维度在任何一个维度上都不匹配,但其中一个数组的长度为1,那么可以通过广播机制进行计算。
具体来说,当进行二元操作(如加法、减法、乘法等)时,NumPy会按照以下步骤进行广播:
1. 如果两个数组的维度不同,将维度较小的数组在其前面补1,使得两个数组的维度一致。
2. 比较两个数组在每个维度上的形状(从最后一个维度开始比较),如果两个数组在某个维度上的形状相同或其中一个数组在该维度上的长度为1,则这两个数组在该维度上是兼容的。
3. 如果两个数组在所有维度上都是兼容的,那么它们是可以进行广播的,即可以在不增加数组维度的情况下进行元素级别的运算。
4. 如果两个数组在某个维度上的长度既不相同也不为1,则广播失败,报错。
广播机制使得我们可以对不同形状的数组进行操作,而无需显式地扩展数组的形状,这在很多情况下非常方便。但在使用广播时,要注意数组形状的兼容性,以免出现错误的计算结果。
假设有两个数组A和B:
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
它们的形状分别为(3,),即一维数组。现在我们想对它们进行加法运算。
由于两个数组的维度相同,可以直接进行元素级别的加法运算,结果是一个新的数组:
C = A + B
print(C)
输出结果为:
[5 7 9]
这是因为在进行加法运算时,NumPy自动进行了广播。它将数组A和B都扩展为相同的形状(3,),然后进行元素级别的加法运算。
再举一个例子,假设有一个一维数组A和一个标量值s:
A = np.array([1, 2, 3])
s = 10
我们想对数组A的每个元素都加上标量值s。同样地,由于标量值可以看作形状为()的数组,它的形状与数组A的形状不匹配。但是根据广播规则,可以进行广播运算:
B = A + s
print(B)
输出结果为:
[11 12 13]
在这个例子中,标量值s被自动扩展为与数组A相同的形状(3,),然后进行元素级别的加法运算。
这些例子展示了NumPy数组的广播机制,它使得我们可以方便地对不同形状的数组进行元素级别的运算,而无需显式地扩展数组的形状。
numpy.around(a,decimals)