2014-10-12 4 views
6

मेरे पास एक बड़े पैमाने पर 2 डी numpy सरणी है, और मैं प्रत्येक पंक्ति के साथ ही उनके सूचकांक के सबसे कम 10 तत्व निकालना चाहता हूं। चूंकि मेरी सरणी काफी हद तक है, इसलिए मैं पूरी सरणी को सॉर्ट नहीं करना चाहूंगा।2-डी Arrays के लिए numpy.argpartition के आउटपुट को कैसे लागू करें?

मैं argpartition() समारोह, जिसके साथ मैं सबसे कम 10 तत्वों के अनुक्रमित प्राप्त कर सकते हैं के बारे में सुना:

top10indexes = np.argpartition(myBigArray,10)[:,:10] 

ध्यान दें कि डिफ़ॉल्ट है, जो मैं चाहता द्वारा argpartition() विभाजन अक्ष -1। परिणाम यहां मेरे आकार के समान आकार में इंडेक्स युक्त इंडिग्स के समान आकार है, जैसे कि पहले 10 इंडेक्स 10 सबसे कम मानों को इंगित करते हैं।

अब मैं उन इंडेक्स के अनुरूप myBigArray के तत्वों को कैसे निकाल सकता हूं?

स्पष्ट फैंसी इंडेक्सिंग myBigArray[top10indexes] या myBigArray[:,top10indexes] कुछ अलग है। मैं भी सूची comprehensions, की तरह कुछ इस्तेमाल कर सकते हैं:

array([row[idxs] for row,idxs in zip(myBigArray,top10indexes)]) 

लेकिन यह है कि उठाना होगा एक प्रदर्शन numpy पंक्तियों पुनरावृत्ति और परिणाम एक सरणी के लिए वापस परिवर्तित मारा।

एनबी: मैं मान प्राप्त करने के लिए केवल np.partition() का उपयोग कर सकता हूं, और वे इंडेक्स (या नहीं ..) के अनुरूप भी हो सकते हैं, लेकिन अगर मैं इससे बच सकता हूं तो मैं विभाजन को दो बार नहीं करना चाहता हूं।

उत्तर

6

आप चपटा प्रतियां और ऐसा करके सभी मूल्यों को निकालने के लिए की जरूरत का उपयोग कर से बचने कर सकते हैं:

num = 10 
top = np.argpartition(myBigArray, num, axis=1)[:, :num] 
myBigArray[np.arange(myBigArray.shape[0])[:, None], top] 

NumPy> = 1.9.0 के लिए यह बहुत ही कुशल और np.take() के बराबर हो जाएगा।

+2

मैंने 'flatten()' का उपयोग करके अपना जवाब हटा दिया। मैंने काम किया कि यह क्यों काम नहीं कर रहा था, लेकिन इसे प्रभावी ढंग से और अधिक जटिल संस्करण बनाये बिना इसे ठीक करने का कोई आसान तरीका नहीं देख सका! –

+1

gr8! मैंने यह भी सीखा कि 'कोई भी' यहां 'newaxis' के रूप में एक ही भूमिका निभाता है :) btw, आपके उत्तर में 'arr' होना चाहिए यदि मेरा संपादन स्वीकार नहीं किया गया है तो' myBigArray' होना चाहिए .. – drevicko

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