0

我是 numpy 广播的新手。我定义了三个 numpy 数组,如下所示:

from numpy import *
a=array([10,20]).reshape(2,1)
b=array([100,200,300]).reshape(1,3)
c=arange(1,11).reshape(1,1,10)

a+b 是 (2,1) 与 (1,3) 的总和,因此它应该是可广播的(dim 1 中的 2vs1,dim 2 中的 1vs3,广播规则已满足)。它的确是:

>>> a+b
array([[110, 210, 310],
       [120, 220, 320]])

a+c 是 (2,1) 与 (1,1,10) 的总和,因此它应该是可广播的(在昏暗 1 中为 2vs1,在昏暗 2 中为 1vs1,在昏暗 3 中为 1vs10,广播规则已满足)。它的确是:

>>> a+c
array([[[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
        [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]])

b+c 是 (1,3) 与 (1,1,10) 的总和,因此它应该是可广播的(dim 1 中的 1vs1,dim 2 中的 3vs1,dim 3 中的 1vs10。但它似乎不是:

>>> b+c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

解释当然很明显......但请帮助我!

4

2 回答 2

1
b[:,:,None] + c

返回一个 (1, 3, 10) 数组。您必须定义缺少的轴(第三个)。

你也可以使用

b[:,:,newaxis] + c

既然你导入* from numpy了,这通常不是一个好主意。

import numpy as np更好。这样,您将始终知道方法的来源(如果您导入更多包):

import numpy as np
a = np.array([10,20]).reshape(2,1)
b = np.array([100,200,300]).reshape(1,3)
c = np.arange(1,11).reshape(1,1,10)

print a + b
print a + c
print b[:,:,np.newaxis] + c
于 2012-04-17T09:34:04.583 回答
1

a+c 是 (2,1) 与 (1,1,10) 的总和,因此它应该是可广播的(在昏暗 1 中为 2vs1,在昏暗 2 中为 1vs1,在昏暗 3 中为 1vs10,广播规则已满足)。它的确是:

>>> a+c array([[[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
                [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]])

不完全是,请注意 a + c 是 (1, 2, 10) 而不是 (2, 1, 10)。

>>> from numpy import array, arange, newaxis
>>> a=array([10,20]).reshape(2,1)
>>> b=array([100,200,300]).reshape(1,3)
>>> c=arange(1,11).reshape(1,1,10)
>>> (a + c).shape
(1, 2, 10).shape

当广播具有不同维度的数组时,维度较少的数组在开始时会用 1 填充,这里有更多信息,所以b + c就像尝试在 (1, 1, 10) 中添加 (1, 1, 3)。@eumiro 的建议,b[:,:,np.newaxis] + c可能是将 b 重塑为 (1,3,1) 的最简单方法,这样您就可以得到您所期望的。

于 2012-04-17T14:37:17.827 回答