为什么以下操作数无法一起广播?

时间:2018-06-08 10:03:46

标签: python python-3.x numpy numpy-broadcasting

阵列具有以下尺寸: dists :( 500,5000) train :( 5000,) test :( 500)

为什么前两个语句会抛出错误,而第三个语句可以正常工作?

  1. dists += train + test
  2. 错误:ValueError: operands could not be broadcast together with shapes (5000,) (500,)

    1. dists += train.reshape(-1,1) + test.reshape(-1,1)
    2. 错误:ValueError: operands could not be broadcast together with shapes (5000,1) (500,1)

      1. dists += train + test.reshape(-1,1) 这很好用!
      2. 为什么会这样?

1 个答案:

答案 0 :(得分:2)

与NumPy的广播规则有关。引用NumPy手册:

  

在两个数组上运行时,NumPy会逐元素地比较它们的形状。它从尾随尺寸开始,并向前发展。

时兼容两个维度      
      
  1. 他们是平等的,或
  2.   
  3. 其中一个是1
  4.   

第一个语句会抛出错误,因为NumPy会查看唯一的维度,而(5000,)(500,)是不相等的,无法一起广播。

在第二个声明中,train.reshape(-1,1)的形状为(5000,1)test.reshape(-1,1)的形状为(500,1)。尾随维度(长度为1)是相同的,因此可以,但是NumPy会检查另一个维度5000 != 500,因此广播在这里失败。

在第三种情况下,您的操作数为(5000,)(500,1)。在这种情况下,NumPy 允许广播。 1D阵列沿着2D阵列的尾随长度1维扩展。

FWIW,形状和广播规则有时候有点棘手,而且我经常对类似的事情感到困惑。