2014-06-25 6 views
10

के साथ एक numpy सरणी स्लाइसिंग मैं एक विशिष्ट अक्ष के साथ एक numpy सरणी गतिशील रूप से टुकड़ा करना चाहता हूँ। यह देखते हुए इस:गतिशील रूप से निर्दिष्ट अक्ष

axis = 2 
start = 5 
end = 10 

मैं इस रूप में एक ही परिणाम हासिल करना चाहते हैं:

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

कुछ इस तरह का उपयोग करना:

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

लेकिन : मूल्यों एक में नहीं रखा जा सकता tuple, तो मैं टुकड़ा बनाने के लिए कैसे पता नहीं कर सकता।

+0

'एम' कैसा दिखता है? – MrAlias

+0

@MrAlias ​​इससे कोई फर्क नहीं पड़ता। सवाल यह है कि गतिशील रूप से एक टुकड़ा कैसे बनाया जाए। –

उत्तर

12

मुझे लगता है कि एक तरह से उपयोग करने के लिए slice(None) होगा:

>>> 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 

मैं एक अस्पष्ट भावना मैंने पहले इस बात के लिए एक समारोह का उपयोग किया है है, लेकिन मैं अब यह पता लगाने के लिए ..

नहीं कर पा रहे
+0

धन्यवाद - यह समस्या हल करता है। 'टुकड़ा (कोई नहीं)' स्पष्ट रूप से ':' के बराबर है। –

4

यह पार्टी के लिए थोड़ा देर हो चुकी है, लेकिन ऐसा करने के लिए डिफ़ॉल्ट बेवकूफ तरीका numpy.take है। हालांकि, वह हमेशा प्रतियां डेटा (चूंकि यह फैंसी इंडेक्सिंग का समर्थन करता है, यह हमेशा मानता है कि यह संभव है)। कि बचने के लिए, slice(None) विकल्प पहले से ही अन्य जवाब में बताया गया पर वापस आने संभवतः एक अच्छा समारोह में यह लपेटकर (कई मामलों में आप एक डेटा, एक प्रति नहीं की दृश्य चाहते हैं):

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

के रूप में यह स्पष्ट रूप से पर्याप्त उल्लेख नहीं किया गया था (और मैं भी इसके लिए देख रहा था):

एक बराबर करने के लिए:

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

है:

a = my_array.take(indices=8, axis=3) 
b = my_array.take(indices=range(2, 7), axis=3) 
संबंधित मुद्दे