2017-10-23 2 views
0

私のプロジェクトはちょうど私が次の操作を行いたい、バグをキャッチしました:numpyファンシーインデックス(インデックスリストの複数の同じインデックス)で要素ごとの演算子(減算)を実行する方法は?

import numpy as np 
a = np.array([1,2,3,4]) 
b = np.array([5,6,7,8]) 
a[[0,1,1]] -= b[[0,1,2]] 

に2つのインデックス= 1 [xxxは]があるので、私は、このように私は[1にしたい、a[1] = a[1]-b[1]-b[2] = -11結果は二願っています]を2回減算する。しかし、このnumpyのコードは生成:

array([-4, -4, -5]) 

私は、アルゴリズム速度を引き上げるnumpyのしたいような理由から、このように私はベクトル化numpyのコードを書きたい(forループのpythonを避ける)

+0

期待される出力は何ですか? – Divakar

+0

'a [1] - = b [[1,2]]。sum()' – BlackBear

+0

c = a [[1,2,2,3]] - b [[1,2,3,4]]とすると、私はc [1] = a [2] -b [2]、c [2] = a [2] -b [2] -b [3] – machen

答えて

1

アプローチ#1あなたが指定された値で指定したインデックスでそれらの蓄積された減算にnp.subtract.atを使用する必要が

-

np.subtract.at(a,[0,1,1], b[[0,1,2]]) 

サンプル実行 -

In [8]: a = np.array([1,2,3,4]) 

In [9]: b = np.array([5,6,7,8]) 

In [10]: np.subtract.at(a,[0,1,1], b[[0,1,2]]) 

In [11]: a 
Out[11]: array([ -4, -11, 3, 4]) 

アプローチ#代わりに2

np.bincount使用して -

unq_ind = ind[np.concatenate(([True],ind[1:] != ind[:-1]))] 
- そうのように、 indがすでにソートされている場合は、 unq_indを得る

ind = np.array([0,1,1]) 
val = b[[0,1,2]] 
unq_ind = np.unique(ind) 
a[unq_ind] -= np.bincount(ind, val).astype(a.dtype) 

アプローチ#2Sあなたは、unique仕事と周り台無しにしたいbincountminlength引数を使用しない場合は(シンプル)

- 累積加算について

a -= np.bincount([0,1,1], b[[0,1,2]], minlength=a.size).astype(a.dtype) 

減算の代わりに提案手法を使用するには、単に、およびbincountの方法では、-=+=に置き換えます。

+0

ありがとう、ありがとうバグは本当に見つけるのは難しいです、私はそれを見つけるためにほぼ全日午後を取った。 – machen

+0

@ machenまったくバグではありません。 'a [[0,1,1]] - = b [[0,1,2]]'では、あなたのアプリケーションのように累積したり減算したりすることはありません。しかし、私はあなたを責めません。公正であるとはいえ警告を発したかもしれません。 – Divakar

+0

はい、おそらくデザイナーが望む動作ですが、私のアルゴリズムは期待していません。 – machen

関連する問題