週の奇妙な日に、私はnumpyで多次元索引付けをほぼ理解しています。 Numpyの機能は'take'ですが、私が望むことをしているようですが、インデックスが乱れていると何が起こるのかを制御できるという特典があります 具体的には、ルックアップテーブルとして質問する3次元配列numpy多次元索引付けと関数 'take'
私は、lut[arr]
arr
を記述した場合、テーブルに
lut = np.ones([13,13,13],np.bool)
および索引として作用する3-長いベクトルの2×2アレイ
arr = np.arange(12).reshape([2,2,3]) % 13
IIUC、数字の2x2x3アレイとして扱われ、これらが使用される場合lut
へのインデックスとして、それぞれ13x13の配列を返します。これは理由を説明しますlut[arr].shape is (2, 2, 3, 13, 13)
。
私は
lut[ arr[:,:,0],arr[:,:,1],arr[:,:,2] ] #(is there a better way to write this?)
を書いて、今3つの用語は、彼らがタプルの2x2の配列を生成するためにzip形式で圧縮されているとlut[<tuple>]
はlut
から単一の要素を生成しているかのよう行動することで、それは私がやりたいことができます。最終的な結果は、lut
からのエントリの2x2配列です。ちょうど私が欲しいものです。
私は、この機能は「空想」のインデックス (配列を使用してインデックスアレイ)と同じことをし...
「を取る」関数のドキュメントを読んでいます。ただし、指定された軸に沿って要素が必要な場合は、 を使用する方が簡単です。
と
軸:INT、任意
値を選択する上軸。
はおそらく、単純に、私はaxis=2
設定、私は三つの値は、ルックアップを実行するために3つのタプルとして使用することになるだろうと思ったが、実際に
np.take(lut,arr).shape = (2, 2, 3)
np.take(lut,arr,axis=0).shape = (2, 2, 3, 13, 13)
np.take(lut,arr,axis=1).shape = (13, 2, 2, 3, 13)
np.take(lut,arr,axis=2).shape = (13, 13, 2, 2, 3)
ので、それは私が何が起こっているか理解していない明らかですに。誰も私が欲しいものを達成する方法を示すことができますか?
'np.take'は' lut.flat'のインデックスに相当します: 'lut.flat [np.ravel_multi_index(arr.T、lut.shape)]。T' – hpaulj
ありがとうどちらもあなたのソリューションです。 ravel_multi_indexはクリッピングを許可するので、私は 'take'は必要ないので、@ hjpauliのDivaCarの解決策 –