2017-08-09 129 views
1

我刚开始学习numpy,通过了numpy的scipy教程。我的问题涉及广播发生的时间。在numpy广播

正如tutorial建议,两个数组是兼容的,如果他们遵循一定的条件,如:

  1. 他们是平等的
  2. 其中之一是1

我的问题是,假设我有以下两个阵列:

import numpy as np 

c1 = np.arange(10).reshape(2,5) 
c2 = np.arange(8).reshape(2,4,1) 
c3 = c1-c2 

但是上面的操作给了我如下兼容/广播错误:

ValueError: operands could not be broadcast together with shapes (2,5) (2,4,1) 

当我示意代表这两个数组纸笔我得到的操作不能进行,但我不能从上面提到的教程,如何遵循操作未在阵列上成功执行。请帮助我理解。

我知道这是基本的东西,但这会有助于我的理解。

问候

+0

c2 = np.arange(8).reshape(4,2 ,1)而不是c2 = np.arange(8).reshape(2,4,1) –

+2

否副轴必须与其他副轴相匹配,在这种情况下,您有1个具有2列和5行的数组,以及另一个是2列4行,第三个轴是单一长度。如果你的第一个数组是'c1 = np.arange(8).reshape(4,2)',那么这是不能被广播的,那么如果你看例子,这也是可行的:https://docs.scipy.org/doc /numpy/user/basics.broadcasting.html你的例子不符合任何可以工作的例子 – EdChum

+0

@GauravDhama是改变形状的作品,但我正在专门寻找这种形状。 –

回答

7

这是确定两个数组的程序可以播放: 对准右对齐形状:

2 5 
2 4 1 

添加1点的左边,这样既形状有相同数量的轴(以下列为列):

1 2 5 
2 4 1 

现在比较下面的列。对于广播工作,每列中的值必须相同,否则其中一个值必须等于1.

在第二列中,2不等于4,因此无法进行广播。 (在第一列和第三列中,1使这些轴与广播兼容,但由于第二列,整个阵列不能广播。)