Python,numpy:3维广播
我是numpy广播的新手。我定义了三个numpy数组,如下所示:Python,numpy:3维广播,python,arrays,math,numpy,broadcast,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)与(1,3)之和,因此它应该是可广播的(第1组中为2vs1,第2组中为1vs3,满足广播规则)。事实上: >>> a+b array([[110, 210, 31
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)之和,因此它应该是可广播的(第1组中为2vs1,第2组中为1vs3,满足广播规则)。事实上:
>>> a+b
array([[110, 210, 310],
[120, 220, 320]])
>>> 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 array([[[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]])
a+c是(2,1)与(1,1,10)之和,因此它应该是可广播的(第1组中为2vs1,第2组中为1vs1,第3组中为1vs10,满足广播规则)。事实上:
>>> a+b
array([[110, 210, 310],
[120, 220, 320]])
>>> 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 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维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
>>b+c
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:形状不匹配:无法将对象广播到单个形状
这个解释当然很明显……但请帮帮我
b[:,:,None] + c
返回(1,3,10)数组。必须定义缺少的轴(第三个轴)
你也可以使用
b[:,:,newaxis] + c
由于您从numpy导入了*,这通常不是一个好主意
import numpy as np
更好。这样,您将始终知道方法来自何处(如果您导入更多包):
a+c是(2,1)对(1,1,10)的和,所以它应该是可广播的
(dim 1中的2vs1、dim 2中的1vs1和dim 3中的1vs10,广播规则为
事实上,它是:
>>> a+b
array([[110, 210, 310],
[120, 220, 320]])
>>> 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 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)
当广播不同维度的阵列时,维度较少的阵列在开始时会被1填充,因此b+c
就像试图将a(1,1,3)与a(1,1,10)相加一样。@eumiro的建议,b[:,:,np.newaxis]+c
,可能是将b重塑为(1,3,1)的最简单方法所以你得到了你想要的。非常感谢!我从numpy import*
知道,我使用它是为了清晰,但你是对的,这应该在任何地方都避免。谢谢你,Bago,事实上我没有注意到(a+c)是a(1,2,10)。事实上(按照eumiro的建议),要获得(2,1,10),我需要编写a[:,np.newaxis]+c
。