2013-06-29 16 views
5

मान लें कि मेरे पास एक आकार के साथ एक बहुआयामी सरणी है जिसे मैं रनटाइम तक नहीं जानता।बहुआयामी numpy सरणी - किसी दिए गए धुरी के साथ रिवर्स

मैं किसी दिए गए धुरी के साथ इसे कैसे उलट सकता हूं, जिसे रनटाइम तक भी नहीं जाना जाता है?

नोटेशन somearray[:,:,::-1,:,:] स्थिर आयाम संदर्भों, as in this other SO question पर निर्भर करता है, इसलिए मैं इसका उपयोग यहां नहीं कर सकता।

उत्तर

7

मैं इसके लिए slice वस्तुओं की एक टपल का प्रयोग करेंगे:

def reversedim(M,k=0): 
    idx = tuple((slice(None,None,-1) if ii == k else slice(None) 
      for ii in xrange(M.ndim))) 
    return M[idx] 
+6

@NilsWerner मुझे ऐसा नहीं लगता है। [यहां] देखें (http://docs.scipy.org/doc/numpy/user/basics.indexing.html) - "ध्यान दें कि सरणी के स्लाइस आंतरिक सरणी डेटा की प्रतिलिपि नहीं बनाते हैं बल्कि मूल डेटा के नए दृश्य भी प्रस्तुत करते हैं । " –

9

आप या तो slice वस्तुओं की एक टपल निर्माण कर सकते हैं इस तरह के रूप @ali_m पता चलता है, या कुछ इस तरह करते हैं:

reversed_arr = np.swapaxes(np.swapaxes(arr, 0, k)[::-1], 0, k) 

यह आकार टुपल के सामने वांछित अक्ष रखता है, फिर उस प्रथम धुरी को उलट देता है, और उसके बाद इसे अपनी मूल स्थिति में वापस कर देता है।

कुछ लोग सोचते हैं कि इस दृष्टिकोण में पठनीयता की कमी है, लेकिन मैं असहमत हूं।

+0

चूंकि यह एक दृश्य देता है, सरणी प्रतिलिपि नहीं है, अच्छा दृष्टिकोण। साथ ही, मुझे यह दृष्टिकोण सबसे सुंदर लगता है जब एलएचएस पर सरणी को 'अक्ष' में बदला जाना चाहिए। – dashesy

संबंधित मुद्दे