【问题标题】:Python, numpy : 3 dimensions broadcastPython,numpy:3维广播
【发布时间】:2012-04-17 09:32:16
【问题描述】:

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

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

【问题讨论】:

    标签: python arrays math numpy broadcast


    【解决方案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
    

    【讨论】:

    • 非常感谢!我知道from numpy import *,我使用它是为了清楚起见,但你是对的,应该在任何地方避免这种情况。
    【解决方案2】:

    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 填充,more info here,所以b + c 就像尝试将 (1, 1, 3) 与 (1, 1) 相加, 10)。 @eumiro 的建议 b[:,:,np.newaxis] + c 可能是将 b 重塑为 (1,3,1) 的最简单方法,这样您就可以得到您所期望的。

    【讨论】:

    • 谢谢 Bago,我确实没有注意到 (a+c) 是 (1,2,10)。事实上(正如eumiro所建议的),要获得(2,1,10)我需要写a[:,:,np.newaxis]+c
    猜你喜欢
    • 1970-01-01
    • 2019-09-03
    • 2014-05-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多