2014-06-25 30 views
10

Belirli bir eksen boyunca bir numpy dizisini dinamik olarak dilimlemek istiyorum. Verilen bu:Dinamik olarak belirtilen bir eksen boyunca numpy dizisi kesme

axis = 2 
start = 5 
end = 10 

Bu aynı sonucu elde etmek istiyorum: Böyle bir şey kullanarak

# m is some matrix 
m[:,:,5:10] 

:

slc = tuple(:,) * len(m.shape) 
slc[axis] = slice(start,end) 
m[slc] 

Ama : değerler koymak edilemez tuple, bu yüzden dilimi nasıl oluşturacağımı anlayamıyorum.

+0

Neler nasıl? – MrAlias

+0

@MrAlias ​​Önemli değil. Soru, dinamik olarak bir dilimin nasıl oluşturulacağıdır. –

cevap

12

Ben tek yön slice(None) kullanmak olacağını düşünüyorum:

>>> m = np.arange(2*3*5).reshape((2,3,5)) 
>>> axis, start, end = 2, 1, 3 
>>> target = m[:, :, 1:3] 
>>> target 
array([[[ 1, 2], 
     [ 6, 7], 
     [11, 12]], 

     [[16, 17], 
     [21, 22], 
     [26, 27]]]) 
>>> slc = [slice(None)] * len(m.shape) 
>>> slc[axis] = slice(start, end) 
>>> np.allclose(m[slc], target) 
True 

Bunu daha önce bir işlevi kullandım belirsiz bir his var ama ..

şimdi bulmak gibi olamaz
+0

Teşekkürler - bu sorunu çözüyor. 'Dilim (Yok)', görünüşe göre ':' ile eşdeğerdir. –

4

Bu, partiye biraz geç, ancak bunu yapmak için varsayılan Numpy yolu numpy.take. Ancak, bir her zaman veri kopyalar (fantezi indekslemeyi desteklediğinden, bunun her zaman mümkün olduğunu varsayar). Bunu önlemek için, muhtemelen güzel bir işlevde sararak, zaten başka cevapta belirtildiği slice(None) seçeneğe son çare olarak (birçok durumda veri değil, bir kopyası bir görünümü isteyecektir):

def simple_slice(arr, inds, axis): 
    # this does the same as np.take() except only supports simple slicing, not 
    # advanced indexing, and thus is much faster 
    sl = [slice(None)] * arr.ndim 
    sl[axis] = inds 
    return arr[sl] 
1

yeterince açık belirtildiği gibi oldu (ve ben de bunun için arıyordu):

eşdeğer için:

a = my_array[:, :, :, 8] 
b = my_array[:, :, :, 2:7] 

geçerli:

a = my_array.take(indices=8, axis=3) 
b = my_array.take(indices=range(2, 7), axis=3) 
İlgili konular