2012-04-17 17 views
0

私はnumpyで放送中のnewbyです。次のように私は3つのnumpyの配列を定義:broadcastableことになっているのでPython、numpy:3次元放送

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) 

+ bは、DIM 1 2vs1(DIM 2 1vs3(2,1)対(1,3)の合計であり、ブロードキャストルールが満たされる)。確かにある:

>>> a+b 
array([[110, 210, 310], 
     [120, 220, 320]]) 

+ Cは、broadcastableことになっているので、(2,1)対(1,1,10)の和である(DIM 1で2vs1、DIM 2で1vs1と1vs10 dim 3、ブロードキャストルールが満たされる)。確かにある:

>>> 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)DIM 2(1,1,10)は、それが薄暗い1 broadcastable(1vs1ことになっているので、和、3vs1、1vs10に対3.薄暗いしかし、そうではないようだ。

>>> b+c 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

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

答えて

1
b[:,:,None] + c 

(1、3、10)の配列を返しますあなたは持っています!。欠けている軸(第3の軸)を定義する。

あなたは一般的に良いアイデアではありません * from numpyを、インポートされたので、

また

b[:,:,newaxis] + c 

を使用することができます。

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 
+0

ありがとうございます!私は '〜からnumpy輸入*'を知って、私はそれを明確にするために使用しましたが、あなたはまさにこれは避けられるべきです。 –

1

+ 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]]]) 

はかなり、+ cは(1、2、10)ではない(2、1、10)であることに気付きません。

異なる寸法を持つ配列を放送する場合、少ない寸法のいずれかが最初に1秒で埋めます
>>> 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 

more info here、そうb + cを追加しようとしているようである(1、1、3)(1、1と、10)。 @ eumiroの提案、b[:,:,np.newaxis] + cは、おそらくbを(1,3,1)に再構成する最も簡単な方法ですので、期待通りの結果を得ることができます。

+0

ありがとうBago、確かに(a + c)が(1,2,10)であることに気付かなかった。そして本当に(eumiroによって示唆されるように)、(2,1,10)を得るためには 'a [:、:、np.newaxis] + c'と書く必要があります。 –

関連する問題