2010-11-26 6 views
10

मैं ismember का उपयोग कर एक विशेष Matlab कोडिंग "पैटर्न" के लिए एक Numpy समकक्ष खोजने के लिए संघर्ष कर रहा हूँ।मैटलैब 'एम्म्बर' समकक्ष (पायथन) में समतुल्य?

दुर्भाग्यवश यह कोड तब होता है जहां अधिकांश समय मेरी मैटलैब स्क्रिप्ट में बिताया जाता है, इसलिए मैं एक कुशल Numpy समकक्ष खोजना चाहता हूं।

मूल पैटर्न में एक बड़े ग्रिड पर सबसेट मैप करने का होता है। मेरे पास समानांतर सरणी के रूप में संग्रहीत प्रमुख मूल्य जोड़े का एक सेट है और मैं इन मानों को उसी तरह से संग्रहीत प्रमुख मूल्य जोड़े की एक बड़ी सूची में सम्मिलित करना चाहता हूं।

कंक्रीटनेस के लिए कहता है कि मेरे पास तिमाही जीडीपी डेटा है जो मैं मासिक समय ग्रिड पर मैप करता हूं।

quarters = [200712 200803 200806 200809 200812 200903]; 
gdp_q = [10.1 10.5 11.1 11.8 10.9 10.3]; 
months = 200801 : 200812; 
gdp_m = NaN(size(months)); 
[tf, loc] = ismember(quarters, months); 
gdp_m(loc(tf)) = gdp_q(tf); 

ध्यान रखें कि सभी तिमाहियों महीनों इसलिए दोनों tf और loc चर आवश्यक हैं की सूची में प्रकट।

मैं StackOverflow पर इसी तरह के सवाल को देखा है लेकिन वे या तो केवल शुद्ध पायथन समाधान (here) या जहां numpy तो प्रयोग किया जाता है loc तर्क वापस नहीं किए गए (here) दे।

मेरे विशेष आवेदन क्षेत्र में, यह विशेष कोड पैटर्न बार-बार उठता है और मेरे कार्यों के अधिकांश CPU समय का उपयोग करता है, इसलिए यहां एक कुशल समाधान मेरे लिए वास्तव में महत्वपूर्ण है।

टिप्पणियां या पुन: डिजाइन सुझावों का भी स्वागत है।

+0

यदि आप इसे स्वयं लागू करेंगे, तो निम्नलिखित के बाद: 1. वस्तुओं के लिए हैश लेते हैं, आपके पास पहले से ही संख्याएं हैं - उन्हें क्रमबद्ध करें और बाइनरी खोज का उपयोग करें। 2. एक अन्य दृष्टिकोण - हैशप – Mikhail

+0

का उपयोग करें मुझे लगता है कि यह [एलेक्स मार्टेलि द्वारा जवाब] (http://stackoverflow.com/questions/1273041/how-can-i-implement-matlabs-ismember-command-in-python/1273815# 1273815) सबसे अच्छा है जो आप प्राप्त कर सकते हैं। –

उत्तर

6

हैं, तो np.searchsorted का उपयोग करें। अन्यथा, प्रकार और फिर np.searchsorted का उपयोग करें:

import numpy as np 
quarters = np.array([200712, 200803, 200806, 200809, 200812, 200903]) 
months = np.arange(200801, 200813) 
loc = np.searchsorted(months, quarters) 

np.searchsorted प्रविष्टि स्थिति देता है। अगर वहाँ एक संभावना है कि आपके डेटा सही श्रेणी में भी नहीं है, तो आप एक जांच बाद में करने के लिए चाहते हो सकता है:

valid = (quarters <= months.max()) & (quarters >= months.min()) 
loc = loc[valid] 

यह एक हे है (एन लॉग ऑन एन) समाधान। यदि यह रन टाइम के मामले में आपके कार्यक्रम में अभी भी एक बड़ा सौदा है, तो आप एक हैशिंग योजना का उपयोग कर सी (++) में केवल एक सबराउटिन कर सकते हैं, जो ओ (एन) होगा (साथ ही कुछ स्थिर कारकों से परहेज करेगा, बेशक)।

+0

धन्यवाद। क्या आप हैशिंग योजना के पीछे विचार का त्वरित अवलोकन दे सकते हैं? मेरे मामले में, ज्यादातर समय दोनों कुंजी सरणी को एक रैखिक ओ (एन) योजना को हल किया जाएगा जो समानांतर में दोनों के माध्यम से बस चलता है।मैं हमेशा किसी भी सी कोड को लिखने में बहुत संकोच करता हूं - ज्यादातर इसलिए क्योंकि मैंने वास्तव में जांच करने के लिए समय नहीं लिया है कि मेरे अपने एक्सटेंशन में कैसे लिंक करें। – snth

+0

मैं "हैश = डॉट ((वैल, i) की लाइनों के साथ कुछ सोच रहा था, मैं मूल्यवान (महीनों) में वैल); परिणाम = [हैश [जे] तिमाहियों में जे के लिए यदि महीनों में जे]" लेकिन कोडित सी। एसटीएल हैश प्रकार का उपयोग करने में सक्षम होने के लिए मैं सी ++ का उपयोग करूंगा। – luispedro

2

मुझे लगता है कि आप मूल MATLAB कोड नमूना को फिर से डिजाइन कर सकते हैं ताकि यह ISMEMBER फ़ंक्शन का उपयोग न करे। इस MATLAB कोड में तेजी लाने और यह आसान अजगर में reimplement करने के लिए कर आप अभी भी चाहते हैं, तो हो सकता है: महीनों क्रमबद्ध हो जाता है

quarters = [200712 200803 200806 200809 200812 200903]; 
gdp_q = [10.1 10.5 11.1 11.8 10.9 10.3]; 

monthStart = 200801;    %# Starting month value 
monthEnd = 200812;    %# Ending month value 
nMonths = monthEnd-monthStart+1; %# Number of months 
gdp_m = NaN(1,nMonths);   %# Initialize gdp_m 

quarters = quarters-monthStart+1; %# Shift quarter values so they can be 
            %# used as indices into gdp_m 
index = (quarters >= 1) & (quarters <= nMonths); %# Logical index of quarters 
                %# within month range 
gdp_m(quarters(index)) = gdp_q(index); %# Move values from gdp_q to gdp_m 
+0

+1: ismember सभी प्रकार की अतिरिक्त सामग्री करता है, जैसे 'अद्वितीय' को कॉल करना जो आपके मामले में आवश्यक नहीं है, आप निश्चित रूप से Matlab (या numpy) कोड को व्यवस्थित कर सकते हैं। – Jonas

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