2017-12-20 22 views
0

私はnumpyの配列があります。私はこのようなスライスを取得したい多次元配列スライス

arr = numpy.arange(25 * 10 * 20) 
arr.resize((25, 10, 20)) 

を:

arr[3:6, 2:8, 7:9] 

これは動作します:

index = [slice(3, 6), slice(2, 8), slice(7, 9)] 
arr[index] 

しかし、これをしない:

>>> index = slice([3, 2, 7], [6, 8, 9]) 
>>> arr[index] 
TypeError: slice indices must be integers or None or have an __index__ method 

ONE sliceオブジェクトで行うことはできますか?またはlistの3 sliceが有効ですか?

+0

1つのスライスとしてではなく、[このクラス](https://stackoverflow.com/a/47605511/7207392)であれば、それはほぼ同じくらい便利です。 –

+0

'slice'と' numpy'インデックスの現在の定義が与えられると、タプルのスライスが基本オブジェクトになります。どんな選択肢もそれを作り出すでしょう。 – hpaulj

+0

ところで、タプルはオブジェクトです。スライスは、3つの属性といくつかのメソッドを持つシンプルなクラスです。それは仕事をする.__ getitem__です。 – hpaulj

答えて

1
>>> help(slice) 
class slice(object) 
| slice(stop) 
| slice(start, stop[, step]) 

は、だから我々は多次元の場合はスライス(起動、停止、ステップ)

>>> import numpy as np 
>>> x = np.arange(10) 

## ERROR 

>>> i=slice([1,3]) 
>>> x[i] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: slice indices must be integers or None or have an __index__ method 

## OK 

>>> i = slice(3,7,2) 
>>> print(x) 
[0 1 2 3 4 5 6 7 8 9] 
>>> print(i) 
slice(3, 7, 2) 
>>> print(x[i]) 
[3 5] 

を使用します。

>>> x = np.arange(12).reshape(3,4) 
>>> x 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
>>> i = slice(0,3,1) 
>>> i 
slice(0, 2, 1) 
>>> x[i,i] 
array([[0, 1], 
     [4, 5]]) 
1

あなたはインデックスの二つのリストをビュン、スライスのリストを作成することができます:

>>> slices = [slice(*i) for i in zip([3,2,7], [6,8,9])] 
>>> arr[slices] 
array([[[ 647, 648], 
    [ 667, 668], 
    [ 687, 688], 
    [ 707, 708], 
    [ 727, 728], 
    [ 747, 748]], 

    [[ 847, 848], 
    [ 867, 868], 
    [ 887, 888], 
    [ 907, 908], 
    [ 927, 928], 
    [ 947, 948]], 

    [[1047, 1048], 
    [1067, 1068], 
    [1087, 1088], 
    [1107, 1108], 
    [1127, 1128], 
    [1147, 1148]]]) 

で確認してください:

>>> numpy.array_equal(arr[slices], arr[3:6,2:8,7:9]) 
True 
0

あなたはnumpy.ogridを使用することができます。

a[ogrid[3:6, 2:8, 7:9]] 

あなたがブロックを選択します。