2012-04-16 21 views
4

Pythonでは、1次元配列から2次元配列を1行ずつ減算したいと考えています。Pythonとnumpy:行単位を引く1次元配列から2次元配列

私は 'for'ループとインデックスを使ってそれを行う方法を知っていますが、numpy関数を使う方が速いと思います。しかし、私はそれを行う方法を見つけませんでした。動作しない何かの例は、このことにより、「for」ループ置き換え、ここれる

from numpy import * 
x=array([[1,2,3,4,5],[6,7,8,9,10]]) 
y=array([20,10]) 
j=array([0, 1]) 
a=zeros([2,5]) 
for i in j : 
...  a[i]=y[i]-x[i] 

をそして:あなたが提案を持っている

a=y[j]-x[j,i] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shape mismatch: objects cannot be broadcast to a single shape 

ドウここでの例では、「for」ループであります?

+4

提案として、私は 'j'という名前のリスト変数を作ることを避けるでしょう。構文的にはこれは問題ありませんが、ほとんどのプログラマはループ内のカウンタに 'i、j、k 'という文字を予約しているので、ここで混乱する可能性があります。 – Hooked

答えて

7

問題は、y-xがそれぞれの形状が(2) (2,5)であることです。適切な放送を行うには、形状(2,1) (2,5)が必要です。私たちは、限り、要素の数が保存されているよう.reshapeでこれを行うことができます。

y.reshape(2,1) - x 

は与える:

array([[19, 18, 17, 16, 15], 
    [ 4, 3, 2, 1, 0]]) 
+1

ありがとうございます! –

+2

問題はありません。スタックオーバーフローへようこそ! – Hooked

2
y[:,newaxis] - x 

はあまりにも動作するはずです。 (少しの)比較利益は、次元のサイズではなく、次元自体に注意を払うことです。