2013-02-09 31 views
6

मैं कुछ थ्रेसहोल्ड से अधिक संख्याओं की 1 डी सरणी के सभी मानों के सूचकांक निकालने का प्रयास कर रहा हूं। सरणी 1e9 लंबी के क्रम में है।न्यूमपी की गति को बढ़ाएं जहां

मेरे दृष्टिकोण NumPy में निम्नलिखित है:

idxs = where(data>threshold) 

यह 20 मिनट है, जो अस्वीकार्य है के ऊपर कुछ समय लगता है। मैं इस कार्य को कैसे गति दे सकता हूं? या, वहाँ तेजी से विकल्प हैं?

(विशिष्ट होना करने के लिए, यह एक मैक ओएस एक्स पर लंबे समय से चल रहा है कि 10.6.7, 1.86 GHz इंटेल, 4GB RAM कुछ भी नहीं और कुछ कर लेता है।)

+0

एनपी को चलाने के लिए 20 मिनट लगते हैं या थ्रेसहोल्ड के नीचे मान हटा दिए जाते हैं? –

+0

एनपी चलाने के लिए 20 मिनट लगते हैं। – mac389

+0

क्या इससे कोई फर्क पड़ता है कि मैं प्रत्येक चर को एक शब्दकोश से कॉल कर रहा हूं? अर्थात। 'डेटा' वास्तव में' डेटा ['टाइम्सरीज़'] है और थ्रेसहोल्ड वास्तव में डेटा है [थ्रेसहोल्ड] [स्पाइक्स] '। मुझे यकीन है कि दूसरा चर एक स्केलर है। – mac389

उत्तर

4

एक mask array की कोशिश करो। यह एक ही डेटा का एक दृश्य बनाता है।

तो वाक्य रचना होगा:

b=a[a>threshold] 

ख एक नई सरणी (जहां के विपरीत), लेकिन एक जहां तत्वों सूचकांक में बूलियन को पूरा के एक दृश्य नहीं है।

उदाहरण:

import numpy as np 
import time 

a=np.random.random_sample(int(1e9)) 

t1=time.time() 
b=a[a>0.5] 
print(time.time()-t1,'seconds') 

मेरी मशीन, प्रिंट कि 22.389815092086792 seconds


संपादित

मैं np.where के साथ एक ही करने की कोशिश की पर, और यह बस के रूप में तेजी से होता है। मुझे संदिग्ध है: क्या आप इन मानों को सरणी से हटा रहे हैं?

+0

यदि मैं ऐसा कर रहा हूं, तो यह अनजान है। मेरा वाक्यविन्यास आपके जैसा ही है। मैं कुछ कैसे हटा सकता हूं? मैं सहमत हूं कि यह धीमे समय की व्याख्या करेगा। – mac389