我是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
解释非常明显......但请帮助我!
答案 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)的最简单方法,因此你可以得到你期望的结果。