2016-07-04 6 views
3

私はnumpy array indexingについてのドキュメントを読んでいますが、基本スライスと高度スライスを区別する方法はまだ不明です。numpy配列の基本スライスと高度スライシングを区別する

ありがとうございました。簡単な1次元配列と

x[(1,2,3),] is fundamentally different than x[(1,2,3)] . The latter is equivalent to x[1,2,3] which will trigger basic selection while the former will trigger advanced indexing. Be sure to understand why this occurs.

Also recognize that x[[1,2,3]] will trigger advanced indexing, whereas x[[1,2,slice(None)]]` will trigger basic slicing.

答えて

3

スタート:

In [326]: x=np.arange(10) 

これら2式は同じことを行う - 配列から3つの要素を選択します。また、コピーを返すことを確認することもできます。ここでは、x[1:4]はビューを返します。

In [327]: x[(1,2,3),] 
Out[327]: array([1, 2, 3]) 

In [328]: x[[1,2,3]] 
Out[328]: array([1, 2, 3]) 

しかし、コマンドなしで、タプルがエラーを発生させます:として

In [329]: x[(1,2,3)] 
... 
IndexError: too many indices for array 

は同じ:

In [330]: x[1,2,3] 
IndexError: too many indices for array 

x[1,2,3]を呼び出しx.__getitem__((1,2,3))にPythonインタプリタによって変換されます。つまり、入力値はタプルとしてメソッドに渡されます。 x[(1,2,3)]の余分な()は違いはありません。しかし、最初の式にカンマはネストのレイヤを追加します。

In [338]: ((1,2,3)) 
Out[338]: (1, 2, 3) 

In [339]: ((1,2,3),) 
Out[339]: ((1, 2, 3),) 

x[[1,2,slice(None)]]x[1,2,:]と同等ですが、私はこれを確認するために、3Dの配列を作成する必要があります。

In [344]: X=np.arange(64).reshape(4,4,4) 

単一要素の3Dインデキシング:最後の次元にスライスに

In [345]: X[(1,2,3)] 
Out[345]: 27 

In [346]: X[1,2,3] 
Out[346]: 27 

が3D:

In [347]: X[1,2,:] 
Out[347]: array([24, 25, 26, 27]) 

インタプリタのみ正方形割り出し括弧内:表記を受け入れ:

In [348]: X[(1,2,:)] 
... 
SyntaxError: invalid syntax 

しかしsliceで、我々は、タプルやリスト

In [349]: X[(1,2,slice(None))] 
Out[349]: array([24, 25, 26, 27]) 

In [350]: X[[1,2,slice(None)]] 
Out[350]: array([24, 25, 26, 27]) 

としてタプルが、それは(1,2,3)でやったのと同じ理由で、ここで働くことを書くことができます。私はそれが意味を成す唯一のものであるため、同じ方法で[]のケースを扱っていると思います。スライスと数字を組み合わせて高度なインデックスを作成することは理にかなっていません。

私は2つの項目に加えて、スライスを選ぶことができますインデックスのトリックがあります:

In [354]: x[np.r_[1,3, 6:10]] 
Out[354]: array([1, 3, 6, 7, 8, 9]) 

が、それは実際の範囲に

In [353]: np.r_[1,3, 6:10] 
Out[353]: array([1, 3, 6, 7, 8, 9]) 
をスライスを拡大しています
関連する問題