如何修复:值错误:操作数无法与形状一起广播?
广播是指 NumPy 在算术运算时处理不同形状数组的能力。其实在数组中,算术运算可以在数组的对应元素上进行。
- 如果两个数组的形状相同,那么两个数组之间的算术运算可以顺利完成。
- 如果 2 个阵列具有不同的形状,则元素到元素的操作是不可能的。但是 NumPy 使得使用概念 广播成为可能。 较小的数组被广播到较大数组的大小,以便对其执行算术运算。
示例:
这里,大小为 1×1 的较小数组被广播到大小为 2×1 的较大数组,其中第 2 和第行也包含第 1 行的相同元素,即 1。所以第一排= > 1+1=2 &第二排= > 2+1=3。
如果我们试图在两个不同形状或不同维度的数组之间执行算术运算,有时 NumPy Broadcasting 会失败。它抛出一个错误,像操作数不能与形状一起广播。有一些场景可以发生广播,也有一些场景失败。所以如果失败了我们需要转换数组的形状。****
*示例:*显示广播失败的位置
Python 3
# import necessary packages
import numpy as np
# create 2 arrays
Array1 = np.arange(2).reshape(1, 2)
Array2 = np.arange(2, 10).reshape(3, 3)
# print 2 arrays
print(Array1)
print(Array2)
print(Array1+Array2)
*输出:*
**
抛出错误**
为了在内部执行广播,请遵循一些规则,将小尺寸数组转换为大数组的形状。因此,每当出现错误时,请检查下面提到的规则,以修改数组的大小,从而成功广播。
广播规则
规则 1:
如果两个数组具有相同的形状或尺寸,那么解释器不会抛出错误。算术运算可以在相应的元素上执行。
*示例:*描述规则 1
Python 3
# import necessary packages
import numpy as np
# create 2 arrays
Array1 = np.arange(4).reshape(2, 2)
Array2 = np.arange(4, 8).reshape(2, 2)
# print 2 arrays
print(Array1)
print(Array2)
# addition between 2 arrays
print('--Addition--')
print(Array1+Array2)
*输出:*
说明
数组 1 数组 2 结果
[[0 1] + [[4 5] = [[0+4 1+5] = [[4 6]
[2 3 ]] [6 7]] [2+6 3+7]] [8 10]]
规则 2:
如果一个数组的一维为 1,则需要将相邻的维与另一个数组进行比较。如果它们相同,它会广播并在它们之间执行算术运算。
*示例:*描述规则 2
Python 3
# import necessary packages
import numpy as np
# create 2 arrays
Array1 = np.arange(2).reshape(1, 2)
Array2 = np.arange(2, 8).reshape(3, 2)
# print 2 arrays
print(Array1)
print(Array2)
# addition between 2 arrays
print('--Addition--')
print(Array1+Array2)
*输出:*
这里 Array1 有一维作为值 1,所以我们需要比较第二维,两个数组的值是否相同。如果相同,则广播发生,否则失败。我们需要按照规则转换数组的大小。在本例中,这些值是相同的,因此加法操作顺利进行。
这里,数组 1 被转换成一个 3×2 形状的数组,该数组被添加到数组 2 中以给出结果。
[[0 1]
[0 1]
[0 1]]
*示例:*描述规则 2
Python 3
# import necessary packages
import numpy as np
# create 2 arrays
Array1 = np.arange(4).reshape(2, 2)
Array2 = np.arange(2).reshape(2, 1)
# print 2 arrays
print(Array1)
print(Array2)
# subtraction between 2 arrays
print('--Subtraction--')
print(Array1-Array2)
*输出:*
规则 3:
如果阵列处于mT6 xT8】n 和nT12 xT14】m 的形状中。在这种情况下,两个数组广播为 mxT20】m if m>n else nT22】xT24】n if n>m
*示例:*描绘规则 3
Python 3
# import necessary packages
import numpy as np
# create 2 arrays
Array1 = np.arange(2).reshape(2, 1)
Array2 = np.arange(2).reshape(1, 2)
# print 2 arrays
print(Array1)
print(Array2)
# addition between 2 arrays
print('--Addition--')
print(Array1+Array2)
*输出:*
说明
Array1 形状- 2×1
阵列 2 形状- 1×2 so 2 阵列被广播成形状 2×2。
数组的广义定义如下
数组 1 +数组 2 结果
[[0 0] + [[0 1] [[0+0 0+1]
[1 1]] [0 1]] [1+0 1+1]]
规则 4:
如果任何一个阵的有它的形状 1 x 1 ,那么不管其他阵的形状如何,它都只是将形状 1 x 1 的阵广播给另一个阵的形状。****
*示例:*描绘规则 4
Python 3
# import necessary packages
import numpy as np
# create 2 arrays
Array1 = np.arange(1).reshape(1, 1)
Array2 = np.arange(2).reshape(1, 2)
# print 2 arrays
print(Array1)
print(Array2)
# addition between 2 arrays
print('--Addition--')
print(Array1+Array2)
*输出*
*数组 1 的形状是 1×11,所以广播到数组 2 的形状是1x2×11】。*
数组 1 +数组 2 =结果
[[0 0]] + [[0 1]] = [[0 1]]
广播失败的上述示例的解决方案是基于场景-2 简单地将数组 1 的形状转换为 1 x 3 或 数组 2 的形状转换为 3 x 2 。****
版权属于:月萌API www.moonapi.com,转载请注明出处