2014-10-02 5 views
15

मैं एक numpy सरणी की प्रत्येक पंक्ति में एक फ़ंक्शन लागू करने के लिए देख रहा हूँ। यदि यह फ़ंक्शन सत्य पर मूल्यांकन करता है तो मैं पंक्ति रखूंगा, अन्यथा मैं इसे छोड़ दूंगा। उदाहरण के लिए, मेरी समारोह हो सकता है:एक numpy सरणी की पंक्ति पंक्तियों?

def f(row): 
    if sum(row)>10: return True 
    else: return False 

मैं सोच रहा था अगर वहाँ के लिए कुछ इसी तरह था:

np.apply_over_axes() 

एक numpy सरणी के प्रत्येक पंक्ति के लिए एक समारोह लागू होता है और परिणाम देता है। मैं की तरह कुछ के लिए उम्मीद की गई थी:

np.filter_over_axes() 

जो एक numpy सरणी के प्रत्येक पंक्ति के लिए एक समारोह लागू होगा और केवल पंक्तियों जिसके लिए समारोह सच लौटे लौट आते हैं। क्या ऐसा कुछ है? या मुझे सिर्फ लूप का उपयोग करना चाहिए?

उत्तर

24

आदर्श रूप में, आप अपने फ़ंक्शन के वेक्टरकृत संस्करण को कार्यान्वित करने में सक्षम होंगे और boolean indexing करने के लिए इसका उपयोग करेंगे। अधिकांश समस्याओं के लिए यह सही समाधान है। Numpy काफी कुछ कार्यों प्रदान करता है जो विभिन्न अक्षों के साथ-साथ सभी बुनियादी परिचालनों और तुलनाओं पर कार्य कर सकते हैं, इसलिए सबसे उपयोगी स्थितियों को वेक्टरिज़ेबल होना चाहिए।

import numpy as np 

x = np.random.randn(20, 3) 
x_new = x[np.sum(x, axis=1) > .5] 

आप पूरी तरह यकीन है कि तुम ऊपर नहीं कर सकते हैं, तो मैं के साथ सूचकांक को bools की एक सरणी बनाने के लिए एक सूची समझ (या np.apply_along_axis) का उपयोग कर सुझाव है।

def myfunc(row): 
    return sum(row) > .5 

bool_arr = np.array([myfunc(row) for row in x]) 
x_new = x[bool_arr] 

यह नौकरी अपेक्षाकृत साफ तरीके से किया जाएगा, लेकिन वेक्टर संस्करण से काफी धीमी हो जाएगी। एक उदाहरण:

x = np.random.randn(5000, 200) 

%timeit x[np.sum(x, axis=1) > .5] 
# 100 loops, best of 3: 5.71 ms per loop 

%timeit x[np.array([myfunc(row) for row in x])] 
# 1 loops, best of 3: 217 ms per loop 
+0

धन्यवाद रोजर, जो फ़ंक्शन मैं उपयोग करना चाहता था वह सिर्फ योग लेने से थोड़ा अधिक जटिल था, इसलिए मैं सूची समझ समाधान का उपयोग कर समाप्त कर सकता हूं। – kyphos

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