2016-03-22 5 views
1

多次元numpy配列で多くの操作を行う必要があります。そのために私はこれについて最善のアプローチを試しています。多次元配列を繰り返し処理し、繰り返しインデックスを操作する最良の方法を教えてください

それでは、私はこのような配列を持っているとしましょう:

A = np.random.uniform(0, 1, size = 100).reshape(20, 5) 

私の目標は、各エントリの最大値numpy.amax()を取得することであり、それがインデックスです。

A[0] = [ 0.64570441 0.31781716 0.07268926 0.84183753 0.72194227]

私は最大値とその最大[0.84183753][0, 3]のインデックスを取得したい:だからA[0]このようなものかもしれません。結果の具体的な表現は一例にすぎません。私は水平インデックスだけを必要とします。

私はnumpyののnditerオブジェクトを使用してみました:

A_it = np.nditer(A, flags=['multi_index'], op_flags=['readwrite']) 

while not A_it.finished: 
    print(np.amax(A_it.value)) 
    print(A_it.multi_index[1]) 
    A_it.iternext() 

私は繰り返しでそのように、すべての配列の要素とそのインデックスにアクセスすることができますが、私はそれぞれにnumpy.amax()機能をもたらすことができるようには見えません。要素と索引を一緒に使用することができます。 nditerオブジェクトを使ってもできますか?

また、Numpy: Beginner nditerでは、nditerを使用するか、numpyの繰り返しを使用すると、通常、私は何か間違っていることを意味します。しかし、私は繰り返しなしでここで私の目標を達成するための別の便利な方法を見つけることができません。明らかに、私は一般的にnumpyとpythonで総初心者ですので、検索やヒントのキーワードは非常に高く評価されています。

+1

A.argmax(axis = 1)? –

+0

'nditer'を使わないでください。定期的なPython forループを使用してください。 – hpaulj

答えて

1

nditerの大きな問題は、各行ではなく、各要素を反復処理することです。これは、CythonまたはCコードの書き直しに向けての足がかりとして最適です。

アレイの各行に最大値を設定したい場合は、単純な反復またはリストの理解がうまくいくでしょう。

for row in A: print(np.amax(row)) 

または

は、配列に戻ってそれを有効にする:

np.array([np.amax(row) for row in A]) 

しかし、あなたは軸パラメータ

np.argmaxamax与えることによって、同じ値を得ることができる最大の場所を特定します。あなたは、その後、同様の最大値を選択することができARGMAX値で

np.argmax(A,axis=1) 

ind=np.argmax(A,axis=1) 
A[np.arange(A.shape[0]),ind] 

(スピードのnp.amaxコールを繰り返すとほぼ同じ)。

関連する問題