NumPy 广播
在数学运算中,我们可能需要考虑不同形状的数组。NumPy可以执行涉及不同形状数组的这种操作。
例如,如果我们考虑矩阵乘法操作,如果两个矩阵的形状相同,则可以轻松执行此操作。但是,如果形状不相似,我们可能也需要进行操作。
请考虑以下示例以乘两个数组。
示例
import numpy as np
a = np.array([1,2,3,4,5,6,7])
b = np.array([2,4,6,8,10,12,14])
c = a*b;
print(c)
输出:
[ 2 8 18 32 50 72 98]
然而,在上面的示例中,如果我们考虑不同形状的数组,将会得到如下所示的错误。
示例
import numpy as np
a = np.array([1,2,3,4,5,6,7])
b = np.array([2,4,6,8,10,12,14,19])
c = a*b;
print(c)
输出:
ValueError: operands could not be broadcast together with shapes (7,) (8,)
在上面的示例中,我们可以看到两个数组的形状不相似,因此它们不能相乘。NumPy可以通过使用广播的概念来执行这样的操作。
在广播中,较小的数组被广播到较大的数组,以使它们的形状相互兼容。
广播规则
广播是可能的,如果满足以下情况。
1. 较小的维度数组可以在其形状中添加’1’。
2. 每个输出维度的大小是该维度中输入大小的最大值。
3. 如果输入在特定维度的大小与输出大小相匹配或其值恰好为1,则可以在计算中使用该输入。
4. 如果输入大小为1,则在计算中沿着该维度使用第一个数据条目。
如果满足以下规则,则可以将广播应用于数组。
1. 所有输入数组具有相同的形状。
2. 数组具有相同数量的维度,并且每个维度的长度要么是常见长度,要么是1。
3. 具有较少维度的数组可以在其形状中添加’1’。
让我们看一个广播的示例。
import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
b = np.array([2,4,6,8])
print("\nprinting array a..")
print(a)
print("\nprinting array b..")
print(b)
print("\nAdding arrays a and b ..")
c = a + b;
print(c)
输出:
printing array a..
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]
printing array b..
[2 4 6 8]
Adding arrays a and b ..
[[ 3 6 9 12]
[ 4 8 11 14]
[12 24 45 11]]