2012-06-28 12 views
6

私はx[:,:,:,:,j,:](次元4のj番目のスライスを取る)を取る方法を知っています。python:次元インデックスを与えられた多次元配列の1スライスを抽出

実行時に次元がわかっていて、既知の定数でない場合、同じことをする方法はありますか?そうする

+1

'x [something]'形式での索引付けは、オブジェクトの '__getitem__'メソッドを呼び出すことと同義です。たとえば、上記のコードは、 '(.length)、' slice(None)、slice(None)、slice(None)、jスライス(None)) 'を' x .__ getitem __() 'に渡すのと同じです。 。 –

+1

@JoelCornett:これにはなぜ '__getitem __()'を使用しますか? '[]'のメリットは何ですか? –

+0

@SvenMarnach:私は、OPがこのコンセプトを理解することで利益を得ると思ったばかりです。彼の質問に対する答えは、それが単なる関数に引数を渡すことの問題であることを理解すれば、自明である。 –

答えて

6

あなたはslice関数を使用して、それを呼び出すことができます実行時に適切な変数リストを次のように指定します。

# Store the variables that represent the slice in a list/tuple 
# Make a slice with the unzipped tuple using the slice() command 
# Use the slice on your array 

例:

>>> from numpy import * 
>>> a = (1, 2, 3) 
>>> b = arange(27).reshape(3, 3, 3) 
>>> s = slice(*a) 
>>> b[s] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

これは同じです:

>>> b[1:2:3] 
array([[[ 9, 10, 11], 
     [12, 13, 14], 
     [15, 16, 17]]]) 

最後に、通常の表記で2 :の間では何も指定しないのと同等のタプルにそれらの場所でNoneを置くことですあなた作成します。

8

1つのオプションは、プログラム的にスライスを構築することである。

slicing = (slice(None),) * 4 + (j,) + (slice(None),) 

代替がnumpy.take()またはndarray.take()を使用することです:

>>> a = numpy.array([[1, 2], [3, 4]]) 
>>> a.take((1,), axis=0) 
array([[3, 4]]) 
>>> a.take((1,), axis=1) 
array([[2], 
     [4]]) 
+0

numpy.takeはここで私が使用するのに適しています。 –

+0

'x 'から何かを抽出するのに'スライシング'をどうやって使いますか? –