2012-11-05 12 views
7

में एक मनमाने ढंग से आयाम को उलट दें मैं एक एन-आयामी सरणी के साथ काम कर रहा हूं, और मैं एक क्रमांकित आयाम को उलटाने का एक तरीका चाहता हूं। तो बजायएक अंडाकार

rev = a[:,:,::-1] 

की तुलना में मैं

rev = a.reverse(dimension=2) 

या कुछ इसी तरह लिखने में सक्षम होना चाहते हैं। मुझे ऐसे उदाहरण नहीं मिल रहे हैं जो पूर्व वाक्यविन्यास पर भरोसा नहीं करते हैं।

+0

यदि आपको सिंटैक्स की आवश्यकता है तो आपको अपने 'rev' फ़ंक्शन में क्यों नहीं रोल करें? – Makoto

+0

मैं इसके साथ ठीक हूं, लेकिन मैं चाहता हूं कि फ़ंक्शन एक पूर्णांक (रिवर्स के आयाम) ले और उस आयाम के साथ सरणी को वापस कर दें। मैं नहीं जानता कि कैसे अनुवाद करना है (उदाहरण के लिए) '1'' [:, :: - 1,:] 'और '0' में' [:: - 1,:,:] 'में मनमानी संख्या के लिए आयाम। – Shep

उत्तर

1

भविष्य में इस पार आ किसी के लिए:

नकली 1.12+ फ़ंक्शन np.flip(array, dimension) है, जो ठीक उसी तरह अनुरोध करता है। इससे भी बेहतर, यह प्रतिलिपि के बजाय डेटा का एक दृश्य देता है, और इसलिए यह निरंतर समय में होता है।

9

यदि आप numpy (पायथन) स्रोत कोड ब्राउज़ करते हैं तो आपको एक विशेष अक्ष पर चलने वाले कार्यों को लिखने के लिए उपयोग की जाने वाली एक चाल मिल जाएगी का उपयोग लक्ष्य अक्ष को axis = 0 स्थिति में रखने के लिए करना है। फिर वे 0-axis पर संचालित कोड लिखते हैं, और फिर को फिर से अपनी मूल स्थिति में 0-axis डालने के लिए उपयोग करते हैं।

तुम बहुत तरह कि यहां कर सकते हैं:

import numpy as np 
def rev(a, axis = -1): 
    a = np.asarray(a).swapaxes(axis, 0) 
    a = a[::-1,...] 
    a = a.swapaxes(0, axis) 
    return a 

a = np.arange(24).reshape(2,3,4) 

print(rev(a, axis = 2)) 

पैदावार

[[[ 3 2 1 0] 
    [ 7 6 5 4] 
    [11 10 9 8]] 

[[15 14 13 12] 
    [19 18 17 16] 
    [23 22 21 20]]] 
6

बाहर कर देता है इस slice साथ किया जा सकता है, जिसके लिए : कुछ संदर्भों में आशुलिपि है। चाल स्लाइस की एक टपल के रूप में सूचकांक वस्तु का निर्माण करने के लिए है:

import numpy as np 

def reverse(a, axis=0): 
    idx = [slice(None)]*len(a.shape) 
    idx[axis] = slice(None, None, -1) 
    return a[idx] 

a = np.arange(24).reshape(2,3,4) 
print reverse(a, axis=2) 

Ellipsis के साथ इसे एक एकल लाइनर में ढह जा सकता है:

a[[slice(None)]*axis + [slice(None, None, -1)] + [Ellipsis]] 
+0

टुकड़ा सबसे अच्छा है! – David