2016-11-24 35 views
2

numpy配列インデックスを使用してヒストグラムを実行しようとしています(配列に対する明示的な反復なし)。numpy配列を複数のインデックスを持つインデックス配列で変更する

import numpy as np 

arr = np.zeros(10) 
inds = np.array([1,2,3,1,3,5,3]) 
arr[inds] += 1.0 
print(arr) 

結果が代わりに

[ 0. 2. 1. 3. 0. 1. 0. 0. 0. 0.]

[ 0. 1. 1. 1. 0. 1. 0. 0. 0. 0.]です:予想通り、それは私がテストを以下でした動作するかどうかだけをチェックします。

は、この動作のためのいくつかの理由がある場合、私はわからない

(すなわち、それは、複数のインデックス配列における回現れるインデックスを省略)(おそらく、これらの操作順序は、独立したparalellizeすることが容易になります)。

numpyでこれを行う方法は他にありますか?

+0

何あなたのスクリプトが行うことINDSすなわちで指定されたARRのインデックスに1を追加することです(1,2,3,5) – Jalo

答えて

0

OPスクリプトがINDSで指定ARRインデックスに一度だけを追加するには、何のためにうまくフィットnumpyの機能インデックスで(1,2,3,5)

、すなわちあなたはnumpy.bincount()が必要です。 この関数の結果はsize = inds.max()になります。追加するインデックスを指定するには、arrをスライスする必要があります。そうでない場合、形状は一致しません。

import numpy as np 

arr = np.zeros(10) 
inds = np.array([1,2,3,1,3,5,3]) 
values = np.bincount(inds) 
print values 
arr[:values.size]+= values 
print(arr) 

値は次のようになります。

[0 2 1 3 0 1] 

とARRは形を取ります:

array([ 0., 2., 1., 3., 0., 1., 0., 0., 0., 0.])

0

numpy配列の操作で複数の代入がある場合、Pythonは最後の代入を代入します。論理的なことのためです。どちらにもmentioned in documentがあります

a = np.arange(5) 
a[[0,0,2]]+=1 
a array([1, 1, 3, 3, 4]) 

0は、インデックスのリストに2回出現するにもかかわらず、0番目の要素は一度だけインクリメント>です。これは、 Pythonではa+=1a=a+1と同等である必要があるためです。

+0

あなたはOP質問 – Jalo

+1

に答えていませんが、実際に私の質問に答えています...私は知りたくありませんでしたヒストグラムを作成する方法だけでなく、将来的にnumpyインデックスを使用する方法も一般的であり、「なぜ」はそのようなものです。 –

+0

@ProkopHapalaなぜそれが機能していないのか知りたかったと思います。しかし、答えは主な質問に集中しなければならないと思います。さらに詳しい解説はもちろん歓迎ですが、私自身の判断では、この情報だけでは有効な答えが得られません。 – Jalo

関連する問題