NumPy - 什么是广播?

时间:2015-09-28 22:41:05

标签: python numpy

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

错误消息暗示我在正确的轨道上。有人可以定义广播,然后提供一些简单的示例,说明它何时起作用?何时不起作用?

5 个答案:

答案 0 :(得分:1)

当你告诉它在不同尺寸的阵列上执行操作时,广播很难实现聪明。例如:

$user = (new User)->find(123); //123 is the PK of the User

在这里,它决定要在较高维数组(1-D)中的每个项目上使用较低维数组(0-D)应用该操作。

您还可以将二维数组(标量)或一维数组添加到二维数组中。在第一种情况下,您只需像以前一样将标量添加到二维数组中的所有项目。在第二种情况下,numpy将逐行添加:

2 + np.array([1,3,5]) == np.array([3, 5, 7])

有很多方法可以告诉numpy沿着不同的轴应用操作。在3-D阵列和1-D,2-D或0-D阵列之间应用操作时,可以进一步采取这种方法。

答案 1 :(得分:1)

术语广播描述了numpy如何在算术运算期间处理具有不同形状的数组。

基本上,numpy可以通过数组扩展操作域。

广播的唯一要求是对齐数组维度,以便:

  • 对齐尺寸相等。
  • 其中一个对齐的尺寸为1。

所以,例如if:

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

我希望你抓住了漂移。如果没有,您可以随时查看官方文档here

干杯!

答案 2 :(得分:1)

1。什么是广播? 广播是张量操作。对神经网络(ML,AI)有用

2。广播的用途是什么?

  • 不支持广播,仅添加相同的Dimension(形状)张量。

  • 广播为我们提供了添加两个不同维度的张量的灵活性。

    例如:在不广播see the image explaining Broadcasting pictorially

  • 的情况下,无法将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)的2D张量X,然后将此2D张量X与形状为(1,3)的1D张量y相加以获得形状为(2,3)的2D张量z

print("X =",X)
print("\n y =",y)
z=X+y
print("X + y =",z)

对于较小的张量几乎是正确的,没有歧义,较小的张量将被广播以匹配较大的张量的形状。(小向量被重复但没有填充虚拟数据或零匹配较大的形状)。

3。广播如何发生?  广播包括两个步骤:

1将广播轴添加到较小的张量以匹配的ndim 大张量。

2在这些新轴旁边重复较小的张量以匹配完整形状 大张量。

4。为什么您的代码中没有广播? 您的代码正常工作,但此处无法进行广播,因为两个张量的形状不同,但Dimensional(1D)相同。 尺寸不相同时会发生广播。 您需要做的是更改张量之一的尺寸,您将体验广播。

5。深入了解。 广播(较小张量的重复)沿广播轴发生,但是由于两个张量都是一维的,因此没有广播轴。 不要将张量维与张量的形状混淆, 张量维度与矩阵维度不同。

答案 3 :(得分:0)

>>> 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具有3个1维元素。 y有2个元素和1个维度。

要执行广播,有2条规则:     1)数组具有相同的尺寸(形状)或     2)不匹配的维度等于1。

例如x具有shape(2,3)[或2行3列];             y的形状为(2,1)[或2行1列]

您可以添加它们吗? x + y? 回答:是的,因为不匹配的尺寸等于1(y中的列)。如果y具有shape(2,4),则将无法进行广播,因为不匹配的尺寸不是1。

如果您发布了:     操作数不能与形状(3,)(2,)一起广播; 这是因为3个和2个完全不匹配都只有1行。

答案 4 :(得分:0)

我建议尝试使用np.broadcast_arrays,运行一些演示可能会给出直观的想法。 Official Document也很有帮助。根据我目前的理解,numpy将比较从尾到头的尺寸。如果1个dim为1,它将在维度上广播,如果一个数组具有更多轴,例如(256 * 256 * 3)乘以(1,),则可以将(1)视为(1,1,1)。广播将产生(256,256,3)。