3

numpy配列で私が観察する次の動作を誰かが私に説明してくれることを願っています:

>>> import numpy as np
>>> data_block=np.zeros((26,480,1000))
>>> indices=np.arange(1000)
>>> indices.shape
(1000,)
>>> data_block[0,:,:].shape
(480, 1000)            #fine and dandy
>>> data_block[0,:,indices].shape
(1000, 480)            #what happened????  why the transpose????
>>> ind_slice=np.arange(300)    # this is more what I really want.
>>> data_block[0,:,ind_slice].shape
(300, 480)     # transpose again!   arghhh!

私はこの転置動作を理解していませんし、私がやりたいことには非常に不便です。誰か説明してくれませんか?そのサブセットを取得するための別の方法はdata_block、大きなボーナスです。

4

2 に答える 2

3

次の方法で目的の結果を得ることができます。

>>> data_block[0,:,:][:,ind_slice].shape
(480L, 300L)

複雑なnumpyインデックス作成がどのように機能するかを完全に理解していないことを告白しますが、ドキュメントはあなたが抱えている問題を示唆しているようです:

スライシング タプルに複数の非: エントリがある基本的なスライシングは、単一の非: エントリを使用してスライシングを繰り返し適用するように機能します。非: エントリは連続して取得されます (他のすべての非: エントリは : に置き換えられます)。 . したがって、基本的なスライスの下のようにx[ind1,...,ind2,:]機能します。x[ind1][...,ind2,:]

警告: 上記は高度なスライスには当てはまりません。

と。. .

高度なインデックス作成は、選択オブジェクト obj が非タプル シーケンス オブジェクト、ndarray (integer または bool データ型)、または少なくとも 1 つのシーケンス オブジェクトまたは ndarray (integer または bool データ型) を持つタプルである場合にトリガーされます。

ind_sliceしたがって、通常のスライスの代わりに配列を使用してインデックスを作成することで、その動作をトリガーしています。

ドキュメント自体には、この種のインデックス作成は「理解するのが少し気が遠くなる可能性がある」と書かれているため、私たち二人がこれに問題を抱えていることは驚くことではありません:-)。

于 2013-06-12T00:29:19.650 に答える
1

ファンシー インデックスがどのように機能するかを理解すれば、それほど驚くことはありません。リストまたは配列をインデックスとして持つ場合、それらはすべて同じ形状であるか、共通の形状にブロードキャスト可能でなければなりません。その形状は、返される配列の基本形状になります。スライスであるインデックスがある場合、ベース シェイプ配列のすべてのエントリは多次元になるため、ベース シェイプは追加のエントリで拡張されます。これは奇妙に思えるかもしれませんが、実際には、多次元ファンシー インデックス作成と一致する唯一の方法です。例として、次のことを行った場合に返される形状がどのようになるかを考えてみてください。

>>> ind_slice=np.arange(16).reshape(4, 4)
>>> data_block[ind_slice, :, ind_slice].shape
(4, 4, 480) # No, (4, 4, 480, 4, 4) is not a better option

あなたが求めているものを手に入れるには、いくつかの方法があります。あなたの質問の特定のケースでは、スライスで求めるものを得ることができるので、最も明白なのは派手なインデックスを使用しないことです:

>>> data_block[0, :, :300].shape
(480, 300)

派手なインデックスが必要な場合は、スライスをブロードキャスト可能な配列に置き換えることができます。

>>> data_block[0, np.arange(480)[:, None], ind_slice].shape
(480, 300)

より複雑なスライスを配列に置き換える必要がある場合は 、 を参照してnp.ogridください。np.mgrid

于 2013-06-12T04:08:59.143 に答える