2017-05-29 21 views
1

の特定のインデックスを埋めることは、これを好き:私はインデックスのリストを持っている3D numpyの配列

selected_coords = [[1, 8, 30], [15, 4, 6] ,...] 

そして、このような値のリスト:

differences = [1, 5, 8, 2, ...] 

どちらも、500個のエントリを持っています。今私は右のインデックスにこれらの値を3d numpyの配列に書きたいと思います。私は何をしようとしたことは以下の通りです:

brain_map = np.zeros(shape=(48,60,22)) 

for i, index in enumerate(selected_coords): 
    ind = list(map(int, index)) 
    brain_map[ind] = differences[i] 

私は、インデックスと私は適切なフォーマットを取得し、このループ内の値を印刷し、私はループの後に行列を印刷する場合の値が置かれているように思える場合指定されたインデックスだけではなく、複数回私は間違って何をしていますか?

+0

最初のインデックスに30を書きましたが、これは範囲外です。これは実際のデータでは当てはまりません。 – maxmijn

答えて

4

可能であれば、numpy配列をループしないようにしてください。そうしないと、パフォーマンスが低下します。 advanced ("fancy") indexingを使用して、特定のインデックスの要素のサブセットにインデックスを付けることができます。これには、同じように動作します:

ind_x, ind_y, ind_zvalsは、同じ長さのすべての1D配列-好きです
brain_map[ind_x,ind_y,ind_z] = vals 

。あなたが持っていることは、本質的に、あなたのインデックス配列の転置である:

brain_map[tuple(zip(*selected_coords))] = differences 

zip(*)トリックは、本質的にそれからインデックス用タプルとして渡すことができるリストのリストを転置します。たとえば:

>>> import numpy as np 
>>> M = np.random.rand(2,3,4) 
>>> coords = [[0,1,2],[1,2,3]] 
>>> tuple(zip(*coords)) 
((0, 1), (1, 2), (2, 3)) 
>>> M[tuple(zip(*coords))] 
array([ 0.12299864, 0.76461622]) 
>>> M[0,1,2],M[1,2,3] 
(0.12299863762892316, 0.76461622348724623) 
+0

ありがとう!したがって、配列のループの悪い習慣を除けば、インデックス用にタプルを使用しなかったため、コードは機能しませんでした。 – maxmijn

+0

@maxmijn高度なインデックス作成は、一般的なケースでは本当に複雑になる可能性があります。あなたの質問に対する簡単な答えは "yes"です:基本的な(すなわち非ファンシーな)インデックススキーム 'M [i、j、k]'は実際にはPythonの暗黙のために 'M [(i、j、k)]'タプル構文。タプル以外のもの(通常はリストまたは配列)をインデックスとして使用すると、ファンシーインデックスがトリガーされる可能性があります。 'M [i、j、k]]' M [i] '、' M [j] 'と' M [k] 'を含む配列を与えます。 、:]、M [j、:、:]、M [k、:、:]である。 'M [0,1,0]'と 'M [[0,1,0]]'を比較してください。後者は3dアレイです。 –

関連する問題