2017-02-01 9 views
5

इस प्रकार मैं एक np.ndarray है वह एनडी सरणी? तो, अगर मैं 4 सबसे छोटा चाहता था तो यहमीटर सबसे छोटा मान

[(0,1,1),(0,4,1),(3,4,1),(0,3,2)] 

जहां (पंक्ति, कॉल, वैल) ऊपर नोटेशन है।

यदि कई मान हैं तो उनमें से एक को यादृच्छिक रूप से चुना जाता है। उदाहरण के लिए, 3 लोग थे और फिर अगला सबसे छोटा मूल्य 2 है (लेकिन 0,3,2), (1,2,2), (1,4,2) सभी संभावित विकल्प थे।

अनिवार्य रूप से, क्या मैं ऊपरी त्रिभुज मैट्रिक्स से कुशलता से उस प्रारूप में के छोटे मूल्यों को निकाल सकता हूं (मैट्रिक्स ऊपर दिए गए उदाहरण से काफी बड़ा है)। मैंने स्क्वायर फॉर्म का उपयोग करके इसे फ़्लैटन करने की कोशिश की, लेकिन मुझे संकेत देने के लिए सूचकांक और मान प्राप्त करने में परेशानी हो रही है। धन्यवाद!

+0

http://stackoverflow.com/questions/30577375/have-numpy-argsort-return-an-array-of-2d-indices 'np.dstack (np.unravel_index (np.argsort (tri) का संभावित डुप्लिकेट .ravel()), arr.shape)) ' जो कुछ भी बचा है, वह मानों को ज़िप्प कर रहा है। – 3novak

+0

इससे मदद मिल सकती है: http://stackoverflow.com/a/10337643/149076 ... हालांकि यह सबसे छोटी के बजाय सबसे बड़ी के आइटम ढूंढ रहा है। एक और, काफी कच्चा, दृष्टिकोण numpy.ndenumerate() का उपयोग करने के लिए heapq.nsmallest() आइटम लेने से पहले एक ढेर में फ़ीड करने वाले समन्वय और मूल्यों की एक विस्तृत सूची उत्पन्न करने के लिए होगा। –

+0

क्या पोस्ट किए गए समाधानों में से कोई भी आपके लिए काम करता है? – Divakar

उत्तर

2

एक Inf भरा सरणी के लिए -

r,c = np.unravel_index(a.ravel().argsort()[:4], a.shape) 
out = zip(r,c,a[r,c]) 

प्रदर्शन के लिए, np.argpartition उपयोग करने पर विचार। तो, np.argpartition(a.ravel(), range(4))[:4] के साथ प्रतिस्थापित करें।

नमूना रन -

In [285]: a 
Out[285]: 
array([[ inf, 1., 3., 2., 1.], 
     [ inf, inf, 2., 3., 2.], 
     [ inf, inf, inf, 5., 4.], 
     [ inf, inf, inf, inf, 1.], 
     [ inf, inf, inf, inf, inf]]) 

In [286]: out 
Out[286]: [(0, 1, 1.0), (0, 4, 1.0), (3, 4, 1.0), (0, 3, 2.0)] 

एक सामान्य मामले के लिए -

R,C = np.triu_indices(a.shape[1],1) 
idx = a[R,C].argsort()[:4] 
r,c = R[idx], C[idx] 
out = zip(r,c,a[r,c]) 

नमूना रन -

In [351]: a 
Out[351]: 
array([[ 68., 67., 81., 23., 16.], 
     [ 84., 83., 20., 66., 48.], 
     [ 58., 72., 98., 63., 30.], 
     [ 61., 40., 1., 86., 22.], 
     [ 29., 95., 38., 22., 95.]]) 
In [352]: out 
Out[352]: [(0, 4, 16.0), (1, 2, 20.0), (3, 4, 22.0), (0, 3, 23.0)] 

प्रदर्शन के लिए, np.argpartition उपयोग करने पर विचार। तो, a[R,C].argsort()[:4] को np.argpartition(a[R,C], range(4))[:4] के साथ बदलें।

0

कुछ इस तरह काम करता है:

import numpy as np 
a = np.random.rand(4,4) 
tuples = [(ix,iy, a[ix,iy]) for ix, row in enumerate(a) for iy, i in enumerate(row)] 
sorted(tuples,key=lambda x: x[2])[:10] 

कहाँ कश्मीर = 10 ([:10]) अपने प्रश्न से।

आप केवल ऊपरी त्रिकोणीय तत्वों आप सूची समझ में एक शर्त जोड़ें कर सकते हैं:

a = np.random.rand(4,4) 
tuples = [(ix,iy, a[ix,iy]) for ix, row in enumerate(a) for iy, i in enumerate(row) if ix<=iy] 
sorted(tuples,key=lambda x: x[2]) 
0

अगर मेरे np.array()n है मैं इसे सपाट (* np.ndenumerate() के साथ), और का उपयोग कर heapq मॉड्यूल के .heapify (द्वारा इसे से n छोटी से छोटी मूल्यों को प्राप्त कर सकता है) और .smallest() तरीकों तो जैसे:

#!python 
flattened = [(y,x) for x,y in np.ndenumerate(n)] 
# tuples reversed for natural sorting on values rather than co-ords 
heapq.heapify(flattened) 
results = heapq.nsmallest(4, flattened) 

लेकिन इस अतिरिक्त स्मृति के बहुत का उपयोग करेगा और Numpy के अजगर की मूल सूची में कुशल सरणियों से बाहर डेटा और समन्वय निकाल देंगे। तो पाइथन में इसे अधिक मूल रूप से करने के लिए शायद बेहतर तरीके हैं।

+0

मैंने कोशिश की लेकिन अगर मैट्रिक्स बहुत बड़ा है तो लूप –

+0

की वजह से यह वास्तव में धीमा है, जैसा कि मैंने कहा, इस प्रकार मेरा अन्य सुझाव, http://stackoverflow.com/a/6910715/149076 ... बाधा एक संकलित विस्तार है आंशिक छंटनी के लिए बेवकूफ। –

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