2013-04-19 4 views
20

तो numpy arrays में विकर्ण सूचकांक प्राप्त करने के लिए अंतर्निहित कार्य होता है, लेकिन मुझे लगता है कि शीर्ष बाएं की बजाय शीर्ष दाएं से शुरू होने वाले विकर्ण को कैसे प्राप्त किया जाए ।एक numpy सरणी के विपरीत विकर्ण

यह ऊपरी बाएँ से शुरू प्राप्त करने के लिए सामान्य कोड है:

>>> import numpy as np 
>>> array = np.arange(25).reshape(5,5) 
>>> diagonal = np.diag_indices(5) 
>>> array 
array([[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19], 
    [20, 21, 22, 23, 24]]) 
>>> array[diagonal] 
array([ 0, 6, 12, 18, 24]) 

तो क्या मैं का उपयोग करता है, तो मैं इसे वापस जाने के लिए चाहते हैं:

array([ 4, 8, 12, 16, 20]) 

उत्तर

28

वहाँ

In [47]: np.diag(np.fliplr(array)) 
Out[47]: array([ 4, 8, 12, 16, 20]) 
है

या

In [48]: np.diag(np.rot90(array)) 
Out[48]: array([ 4, 8, 12, 16, 20]) 
दो के

, np.diag(np.fliplr(array)) तेजी से होता है:

In [50]: %timeit np.diag(np.fliplr(array)) 
100000 loops, best of 3: 4.29 us per loop 

In [51]: %timeit np.diag(np.rot90(array)) 
100000 loops, best of 3: 6.09 us per loop 
+3

आप समय बात करना शुरू कर दिया: 'कदम = लेन (सरणी) - 1; np.take (सरणी, np.arange (चरण, array.size, चरण)) ' – Jaime

+0

@ जैम: यह बहुत अच्छा है - मेरे समाधान से बहुत तेज़ है। शायद हमें 'np.arange (step, array.size-1, step) 'की आवश्यकता है? कृपया इसे समाधान के रूप में पोस्ट करें ताकि मैं इसे वोट दे सकूं। – unutbu

+1

मेरे पास टिम पीटर्स 'जेन ऑफ पायथन मेरे घन दीवार पर लटक रहा है, बस मेरे मॉनीटर से बाहर है। मैं टिप्पणी के कोड को उत्तर के रूप में पोस्ट नहीं कर सकता हूं जबकि ** पठनीयता की गणना ** मुझे देख रही है ...: पी 'फ्लिपलर' के साथ आपका समाधान शायद सबसे अच्छा है: पर्याप्त तेज़ और बहुत अधिक, जब आप इसे फिर से समझते हैं तो अधिक समझ में आता है इसे लिखने के कुछ महीने बाद। – Jaime

3

यहाँ दो विचार कर रहे हैं:

, इसलिए यहाँ बनाने जल्दी में मेरे सबसे अच्छे शॉट है
step = len(array) - 1 

# This will make a copy 
array.flat[step:-step:step] 

# This will make a veiw 
array.ravel()[step:-step:step] 
+0

दूसरा प्रतिलिपि बना सकता है;) – seberg

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