Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是广播?_Python_Numpy - Fatal编程技术网

Python 什么是广播?

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,) 不过,错误消息提示

我不明白。该文件解释了广播规则,但似乎没有用英语对其进行定义。我的猜测是,广播是当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,) 

不过,错误消息提示我的思路是正确的。有人能定义广播,然后提供一些简单的例子,说明广播何时起作用,何时不起作用吗?

当你告诉广播在不同维度的阵列上执行操作时,广播是一种聪明的做法。例如:

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张量相加

运行Python示例代码,了解该概念

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,)