2012-10-10 10 views
9

के साथ भारित चलती औसत मैं एक चलती औसत फ़ंक्शन लिख रहा हूं जो numpy में convolve फ़ंक्शन का उपयोग करता है, जो एक (weighted moving average) के बराबर होना चाहिए। मेरे वजन सब बराबर हैं जब (एक सरल arithmatic औसत के रूप में), यह ठीक काम करता है:numpy.convolve

data = numpy.arange(1,11) 
numdays = 5 
w = [1.0/numdays]*numdays 
numpy.convolve(data,w,'valid') 

array([ 3., 4., 5., 6., 7., 8.]) 

देता है हालांकि, जब मैं एक भारित औसत उपयोग करने का प्रयास

w = numpy.cumsum(numpy.ones(numdays,dtype=float),axis=0); w = w/numpy.sum(w) 

(उसी डेटा के लिए) 3.667,4.667,5.667,6.667, ... मुझे उम्मीद है कि मुझे

array([ 2.33333333, 3.33333333, 4.33333333, 5.33333333, 6.33333333, 
     7.33333333]) 

यदि मैं 'मान्य' ध्वज हटा देता हूं, तो मुझे सही मान भी नहीं दिखते हैं। मैं वास्तव में डब्लूएमए के साथ-साथ एमए के लिए घूमना चाहता हूं क्योंकि यह कोड क्लीनर (एक ही कोड, अलग वजन) बनाता है और अन्यथा मुझे लगता है कि मुझे सभी डेटा के माध्यम से लूप करना होगा और स्लाइस लेना होगा।

इस व्यवहार के बारे में कोई विचार?

उत्तर

14

आप जो चाहते हैं np.correlate एक संकल्प में दूसरा तर्क मूल रूप से उलटा हुआ है, ताकि आपका अपेक्षित परिणाम np.convolve(data, w[::-1], 'valid') के साथ होगा।

+1

धन्यवाद मैं देखता हूं। और मुझे यह भी नहीं पता था कि [:: - 1] एक सरणी/सूची को उलट देगा। यह बेहद उपयोगी जानकारी है! –

+1

केवल एक टिप्पणी के रूप में, 'np.cumsum (np.ones (numdays, dtype = float), axis = 0)' np.arange (numdays) + 1.' या 'np.np प्राप्त करने का एक बहुत ही जटिल तरीका है .arange (1।, numdays + 1।) '। –