2013-04-24 8 views
7

को अनदेखा करने वाले numpy सरणी से सबसे छोटे एन मान प्राप्त करें मुझे एक numpy सरणी से 10 सबसे छोटे वास्तविक मूल्यों को खोजने के लिए एक अच्छी, त्वरित विधि की आवश्यकता है जो मनमाने ढंग से कई nan और/या inf मानों को प्राप्त कर सके।इंफ और नैन

मुझे इन सबसे छोटे वास्तविक मूल्यों के सूचकांक की पहचान करने की आवश्यकता है, न कि मूल्यों को स्वयं।

मुझे argmin और nanargmin numpy से फ़ंक्शन मिले हैं। वे वास्तव में काम नहीं कर रहे हैं क्योंकि मैं 1 से अधिक मान निर्दिष्ट करना चाहता हूं, जैसे कि मैं सबसे छोटे 100 मान चाहता हूं, उदाहरण के लिए। इसके अलावा वे दोनों -inf मानों को सरणी में मौजूद होने पर सबसे छोटा मान मानते हैं।

heapq.nsmallest प्रकार के काम, लेकिन यह nan और -inf मूल्यों को सबसे कम मान के रूप में भी देता है। इसके अलावा यह मुझे उन इंडेक्स नहीं देता है जिन्हें मैं ढूंढ रहा हूं।

यहां कोई भी सहायता की सराहना की जाएगी।

+0

पुनरावृति से अधिक/सरणी कॉपी, सभी Nans और -inf inf में तब्दील अपने कार्य को चलाने/वर्ष प्रति पर वापस लौटने मिल छोटी से छोटी N मानों, उन्हें वापस कन्वर्ट करने के लिए? मूर्खतापूर्ण हैकी, लेकिन हम्म ... – Patashu

+0

मदद के लिए धन्यवाद, अगर मुझे सरल जवाब नहीं मिल रहा है तो मुझे यही करना होगा। –

उत्तर

10

केवल उन्हीं मान जो इसे फेंकना चाहिए नकारात्मक अनंत हैं। तो कोशिश:

import numpy as np 
a = np.random.rand(20) 
a[4] = -np.inf 
k = 10 
a[np.isneginf(a)] = inf 
result = a[np.argsort(a)[:k]] 
+1

'2 * np.max' काम नहीं करता है अगर सभी तत्व नकारात्मक हैं, तो मुझे लगता है कि 'inf' का उपयोग करने के लिए बेहतर है। – interjay

+0

हाँ मैंने अभी इसे inf –

+0

बनाया है, अच्छा बिंदु .. – YXD

1

आप इस तरह inf और Nan के सूचकांक पा सकते हैं:

for item in a:  
    idxInf=(np.isnan(a[item])).nonzero() 
    idxNan=(np.isnan(a[item])).nonzero() 

यानी:

a=np.array([[12,12,111],[np.inf,np.inf,1,2,3],[np.nan,7,8]]) 

आप a के माध्यम से लूप और साथ यह जाँच कर सकते हैं

In [17]: (np.isnan(a[2])) 
Out[17]: array([ True, False, False], dtype=bool) 

In [18]: (np.isnan(a[2])).nonzero() 
Out[18]: (array([0]),) 
2

ऐसा लगता है कि आप मूल सरणी को संशोधित करने की कोशिश करने के बजाय, अपने सॉर्ट किए गए सरणी से पहले n सीमित मूल्यों को ले सकते हैं, जो खतरनाक हो सकता है।

n = 10 
b = np.sort(a) 
smalls = b[np.isfinite(b)][n:] 
संबंधित मुद्दे