0

私はnumpyで放送する初心者です。次のように 3 つの 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) の合計であるため、ブロードキャスト可能であると想定されます (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) 対 (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

説明は確かに明白です...しかし、私を助けてください!

4

2 に答える 2

1

a+c は (2,1) 対 (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]]])

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 が埋め込まれます。詳細はこちらを参照してください。つまりb + c、(1, 1, 3) に (1, 1, 10) を追加しようとするようなものです。@eumiro の提案 はb[:,:,np.newaxis] + c、おそらく b を (1,3,1) に再形成する最も簡単な方法であるため、期待どおりの結果が得られます。

于 2012-04-17T14:37:17.827 に答える
1
b[:,:,None] + c

(1, 3, 10) 配列を返します。欠落している軸 (3 番目の軸) を定義する必要があります。

使用することもできます

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
于 2012-04-17T09:34:04.583 に答える