在numpy中广播数组

时间:2018-07-15 15:11:53

标签: python numpy numpy-broadcasting

我得到了一个数组并将其重塑为以下尺寸:(-1,1,1,1)和(-1,1):

 Array A:
[-0.888788523827  0.11842529285   0.319928774626  0.319928774626  0.378755429421  1.225877519716  3.830653798838]

A.reshape(-1,1,1,1):
[[[[-0.888788523827]]]


 [[[ 0.11842529285 ]]]


 [[[ 0.319928774626]]]


 [[[ 0.319928774626]]]


 [[[ 0.378755429421]]]


 [[[ 1.225877519716]]]


 [[[ 3.830653798838]]]]

A.reshape(-1,1):
[[-0.888788523827]
 [ 0.11842529285 ]
 [ 0.319928774626]
 [ 0.319928774626]
 [ 0.378755429421]
 [ 1.225877519716]
 [ 3.830653798838]]

然后我完成了减法运算,广播进入了,所以我得到的矩阵是7x1x7x1。

我很难想象广播的中间步骤。我的意思是我无法想象重复播放数组的哪些元素以及它们在广播时的外观。 请问有人可以阐明这个问题吗?

1 个答案:

答案 0 :(得分:0)

In [5]: arr = np.arange(4)
In [6]: A = arr.reshape(-1,1,1,1)
In [7]: B = arr.reshape(-1,1)
In [8]: C = A + B
In [9]: C.shape
Out[9]: (4, 1, 4, 1)
In [10]: A.shape
Out[10]: (4, 1, 1, 1)
In [11]: B.shape
Out[11]: (4, 1)

有2条基本广播规则:

  • 扩展尺寸以匹配-通过在开头添加尺寸1尺寸
  • 调整所有尺寸1的尺寸以匹配

因此在此示例中:

 (4,1,1,1) + (4,1)
 (4,1,1,1) + (1,1,4,1)    # add 2 size 1's to B
 (4,1,4,1) + (4,1,4,1)    # adjust 2 of the 1's to 4
 (4,1,4,1)

第一步也许是最令人困惑的。 (4,1)扩展为(1,1,4,1),而不是(4,1,1,1)。该规则旨在避免歧义-通过以一致的方式扩展,而不一定是人类可能会直观地想要的。

想象一下两个数组都需要扩展才能匹配的情况,并且可以在任一方向上添加维度:

 (4,) and (3,)
 (1,4) and (3,1)  or (4,1) and (1,3)
 (3,4)            or (4,3)
 confusion

该规则要求程序员选择哪个扩展到右边的(4,1)或(3,1)。 numpy然后可以明确地添加另一个。


举一个简单的例子:

In [22]: A=np.arange(3).reshape(-1,1)
In [23]: B=np.arange(3)
In [24]: C = A+B   (3,1)+(3,) => (3,1)+(1,3) => (3,3)
In [25]: C
Out[25]: 
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])
In [26]: C.shape
Out[26]: (3, 3)

存在[0,2,4],但位于C的对角线上。

当这样广播时,结果是一种outer和:

In [27]: np.add.outer(B,B)
Out[27]: 
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])