Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,numpy:3维广播_Python_Arrays_Math_Numpy_Broadcast - Fatal编程技术网

Python,numpy:3维广播

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

我是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, 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