2012-10-23 15 views
15

में किसी शर्त को पूर्ण करने के लिए एक numpy सरणी से केवल तत्व प्राप्त करने के लिए एक बहुत (त्वरित) त्वरित और कुशल तरीका होना चाहिए, या इसके टुकड़े से और भी दिलचस्प रूप से। मान लीजिए मैं एक numpy सरणी है:केवल उन मानों को प्राप्त करना जो एक numpy array

s = [9, 12, 13, 14] 

मैं एक से तत्वों का चयन कर सकते हैं::

import numpy as np 
a = np.arange(-10,10) 
अब

अगर मैं एक सूची है

a[s] #array([-1, 2, 3, 4]) 

मैं एक (numpy हो सकता है) एक सारणी को पूरा करने वाले तत्वों से बना सरणी, यानी सकारात्मक (या नकारात्मक) हैं? यह परिणाम चाहिए

np.ifcondition(a[s]>0, a[s]) #array([2, 3, 4]) 

यह तुच्छ लग रहा है, लेकिन मैं एक साधारण और गाढ़ा अभिव्यक्ति को खोजने के लिए सक्षम नहीं था। मुझे यकीन है कि मास्क करते हैं लेकिन यह वास्तव में मुझे सीधे नहीं दिखता है। लेकिन दोनों ही ने:

a[a[s]>0] 
a[s[a[s]>0]] 

तथ्य अच्छे विकल्प में हैं।

सहायता के लिए धन्यवाद।

+0

'np.clip' या' np.where' जैसे अधिकांश टूल सरणी के मूल आकार को छोड़ देते हैं, इसलिए वे वास्तव में मेरी ज़रूरत को पूरा नहीं करते हैं। – gluuke

उत्तर

12

कैसे के बारे में:

In [19]: b = a[s] 

In [20]: b[b > 0] 
Out[20]: array([2, 3, 4]) 
+0

सही! ... ऐसा लगता है: मुझे बस एक नई सरणी परिभाषित करने की आवश्यकता है। – gluuke

+2

'एक [एस] [ए [एस]> 0] 'भी काम करता है, लेकिन यह दो बार' एक [s]' recompute करने के लिए numpy का कारण बनता है। – unutbu

+0

इस तरह की चीज करने का यह मानक तरीका है। (मुझसे +1) – mgilson

4

आप निश्चित रूप से unutbu के जवाब को स्वीकार करना चाहिए, और यह क्या मैं आम तौर पर numpy के भीतर स्थिति के इस प्रकार के लिए इस्तेमाल करते हैं। लेकिन काम करने के कई तरीके हो रही है, एक विधि है कि numpy के बाहर काम करता है होने के हित में, या मामले में मध्यवर्ती सरणी आपत्तिजनक रूप से बहुत बड़ा है, मैं इस विकल्प जोड़ देंगे:

In [3]: [a[S] for S in s if a[S]>0] 
Out[3]: [2, 3, 4] 

फिर, unutbu की विधि है काफी तेज़ लेकिन मुझे यह विधि पसंद है क्योंकि यह अभी भी सामान्यीकृत कर सकती है। आप एक महंगी फंकी समारोह (जैसे, नहीं अनुक्रमण) है, और है कि फ़ंक्शन के परिणाम का परीक्षण करना चाहते हैं, तो आप ऐसा करने के लिए चाहते हो सकता है:

In [5]: [f for S in s for f in [FunkyFunction(a[S])] if f>0] 
Out[5]: [2, 3, 4] 

इस बारे में अजीब बात यह है कि आप एक सूची के अंदर करना है दूसरी सूची, लेकिन इस आंतरिक सूची में केवल एक आइटम है। असल में आप जो कर रहे हैं वह वैरिएबल f पर वैल्यू को सहेज रहा है, और फिर उस मान का दो बार उपयोग कर रहा है: एक बार मान (f>0) का परीक्षण करने के लिए, और परीक्षण पास होने पर सूची में उस मान का उपयोग करने के लिए।

1

मुझे पता है कि यह एक पुराना सवाल है, और मुझे यकीन नहीं है कि जब यह पूछा गया था तो निम्नलिखित उपलब्ध था, लेकिन जब से मैं यहां एक समान प्रश्न के साथ आया, तो यही वह है जो मैंने पाया मेरे लिए:

np.extract(a[s] > 0, a[s]) 
संबंधित मुद्दे