Python 什么是广播?
我不明白。该文件解释了广播规则,但似乎没有用英语对其进行定义。我的猜测是,广播是当NumPy用虚拟数据填充更小维度的数组以执行操作时。但这不起作用:Python 什么是广播?,python,numpy,Python,Numpy,我不明白。该文件解释了广播规则,但似乎没有用英语对其进行定义。我的猜测是,广播是当NumPy用虚拟数据填充更小维度的数组以执行操作时。但这不起作用: >>> x = np.array([1,3,5]) >>> y = np.array([2,4]) >>> x+y *** ValueError: operands could not be broadcast together with shapes (3,) (2,) 不过,错误消息提示
>>> x = np.array([1,3,5])
>>> y = np.array([2,4])
>>> x+y
*** ValueError: operands could not be broadcast together with shapes (3,) (2,)
不过,错误消息提示我的思路是正确的。有人能定义广播,然后提供一些简单的例子,说明广播何时起作用,何时不起作用吗?当你告诉广播在不同维度的阵列上执行操作时,广播是一种聪明的做法。例如:
2 + np.array([1,3,5]) == np.array([3, 5, 7])
在这里,它决定您要使用低维数组(0-D)对高维数组(1-D)中的每个项应用该操作
还可以将0-D数组(标量)或1-D数组添加到二维数组中。在第一种情况下,只需将标量添加到二维数组中的所有项,如前所述。在第二种情况下,numpy将按行添加:
In [34]: np.array([1,2]) + np.array([[3,4],[5,6]])
Out[34]:
array([[4, 6],
[6, 8]])
还有一些方法可以告诉numpy沿不同的轴应用该操作。通过在三维阵列和一维、二维或0-D阵列之间应用运算,可以进一步实现这一点。术语广播描述了numpy在算术运算期间如何处理具有不同形状的阵列 这基本上是numpy在阵列上扩展操作域的一种方式 广播的唯一要求是对齐阵列尺寸,以便:
- 对齐的尺寸相等
- 其中一个对齐标注为1
x = np.ndarray(shape=(4,1,3))
y = np.ndarray(shape=(3,3))
不能像这样对齐x和y:
4 x 1 x 3
3 x 3
但你也可以这么说:
4 x 1 x 3
3 x 3
这样的手术效果如何?
假设我们有:
x = np.ndarray(shape=(1,3), buffer=np.array([1,2,3]),dtype='int')
array([[1, 2, 3]])
y = np.ndarray(shape=(3,3), buffer=np.array([1,1,1,1,1,1,1,1,1]),dtype='int')
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
操作x+y
将导致:
array([[2, 3, 4],
[2, 3, 4],
[2, 3, 4]])
我希望你明白了。如果没有,您可以随时查看官方文档
干杯 什么是广播? 广播是一种张量运算。有助于神经网络(ML,AI) 2.广播有什么用?
- 在没有广播的情况下,只支持添加相同的维度(形状)张量
- 广播为我们提供了添加两个不同维度的张量的灵活性 例如:如果不广播,则无法将2D张量与1D张量相加
x = np.array([1,3,5,6,7,8])
y = np.array([2,4,5])
X=x.reshape(2,3)
对x进行整形以获得形状为(2,3)的二维张量x,并将该二维张量x与形状为(1,3)的一维张量y相加以获得形状为(2,3)的二维张量z
关于较小的张量,您几乎是正确的,没有歧义,较小的张量将被广播以匹配较大张量的形状。(小向量被重复,但没有填充虚拟数据或零以匹配较大张量的形状)
3。广播是如何发生的?
广播包括两个步骤:
1广播轴添加到较小的张量,以匹配的ndim
大张量
2沿着这些新轴重复较小的张量,以匹配整个形状
关于大张量
4。为什么不在代码中进行广播?
您的代码正在工作,但广播不能在这里发生,因为两个张量的形状不同,但维度(1D)相同。
当维度不相同时会发生广播。
你们需要做的是改变其中一个张量的维数,你们将体验到广播
5。深入。
广播(小张量的重复)沿广播轴发生,但由于两个张量都是一维的,因此没有广播轴。
不要混淆张量的维数和张量的形状,
张量维数与矩阵维数不同
广播就是numpy如何对不同形状的数组进行数学运算。形状是数组的格式,例如您使用的数组x有3个一维元素;y有2个元素和1个维度
要进行广播,有两条规则:
1) 数组具有相同的维度(形状)或
2) 不匹配的维度等于1
例如,x具有形状(2,3)[或2行3列];
y具有形状(2,1)[或2条线和1列]
你能加上它们吗?x+y?
回答:是的,因为不匹配的维度等于1(y中的列)。如果y具有形状(2,4),则不可能进行广播,因为不匹配的尺寸不是1
在您发布的案例中:
操作数无法与形状(3,)(2,)一起广播;
这是因为3和2不匹配,尽管它们都有一行。我建议尝试运行,一些演示可能会给出直观的想法。这也很有帮助。根据我目前的理解,numpy将比较从尾部到头部的尺寸。如果一个dim为1,它将在维度中广播,如果一个阵列具有更多轴,例如(256*256*3)乘(1),则可以将(1)视为(1,1,1)。和广播将使(256256,3) 这是一个很好的参考,
print("X =",X)
print("\n y =",y)
z=X+y
print("X + y =",z)
>>> x = np.array([1,3,5])
>>> y = np.array([2,4])
>>> x+y
*** ValueError: operands could not be broadcast together with shapes (3,) (2,)