Python,numpy:3维广播

时间:2012-04-17 09:32:16

标签: python arrays math numpy broadcast

我是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)vs(1,3)之和,因此它应该是可广播的(dim 1中为2vs1,dim 2中为1vs3,广播规则已完成)。确实是:

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

a + c是(2,1)vs(1,1,10)总和所以它应该是可广播的(dim 1中为2vs1,dim 2中为1vs1,dim 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)vs(1,1,10)总和所以它应该是可广播的(昏暗1中为1vs1,昏暗2中为3vs1,昏暗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

解释非常明显......但请帮助我!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

  

a + c是(2,1)vs(1,1,10)总和所以它应该是可广播的   (dim 1为2vs1,dim为2vs1,dim为3vs10,广播规则为   如愿以偿)。确实是:

>>> 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,more info here,因此b + c就像尝试添加(1,1,3)一样(1,1,10)。 @ eumiro的建议,b[:,:,np.newaxis] + c,可能是将b重塑为(1,3,1)的最简单方法,因此你可以得到你期望的结果。