2015-03-07 5 views
8

मैं मान a = (2,3,0,0,4,3)क्या जोड़ते समय न्यूमपी क्षय में cumsum कार्य कर सकते हैं?

y=0 
for x in a: 
    y = (y+x)*.95 

की एक सरणी वहाँ किसी भी तरह से numpy में cumsum का उपयोग करें और अगले मूल्य जोड़ने से पहले प्रत्येक पंक्ति के .95 क्षय लागू करने के लिए है है?

उत्तर

1

मुझे नहीं लगता कि यह लूप का उपयोग किये बिना अकेले न्यूमपी में आसानी से किया जा सकता है।

एक सरणी आधारित विचार मैट्रिक्स M_ij = .95 ** i * a [N-j] की गणना करना होगा (जहां एन ए में तत्वों की संख्या है)। जिन संख्याओं को आप ढूंढ रहे हैं वे विकर्ण रूप से प्रविष्टियों को जोड़कर पाए जाते हैं (i-j निरंतर के साथ)। आप इस प्रकार कई numpy.diagonal(…).sum() का उपयोग कर सकते हैं।

आपके द्वारा रूपरेखा की जाने वाली अच्छी पुरानी एल्गोरिदम स्पष्ट है और शायद पहले से ही तेज है (अन्यथा आप साइथन का उपयोग कर सकते हैं)।

जो आप चाहते हैं उसे एक लूप के बिना नूमपी के माध्यम से करना चाहते हैं जैसे जादूगर। किसी को भी मारता है जो इसे खींच सकता है।

8

आप एक साधारण IIR Filter के लिए पूछ रहे हैं। SciPy के lfilter() कि के लिए बना है:

import numpy as np 
from scipy.signal import lfilter 

data = np.array([2, 3, 0, 0, 4, 3], dtype=float) # lfilter wants floats 

# Conventional approach: 
result_conv = [] 
last_value = 0 
for elmt in data: 
    last_value = (last_value + elmt)*.95 
    result_conv.append(last_value) 

# IIR Filter: 
result_IIR = lfilter([.95], [1, -.95], data) 

if np.allclose(result_IIR, result_conv, 1e-12): 
    print("Values are equal.") 
+2

मैं 'xx = np.array ([2, 3, 0, 0, 4, 3], dtype = np.float64) का उपयोग करने पर विचार करता हूं 'इसके बजाय यहां –

+0

मान्य बिंदु। मैं अपना कोड दोबारा चलाता हूं और ऐसा लगता है कि 'lfilter()' 'की शिकायत एक अलग समस्या से आई है। – Dietrich

4

आप केवल एक 1 डी सरणी के साथ काम कर रहे हैं, तो scipy उपयुक्तता की कमी या एक कस्टम numpy के लिए ufunc को कम करने, तो अजगर 3.3+ लेखन में, आप itertools.accumulate उपयोग कर सकते हैं, उदाहरण के लिए:

from itertools import accumulate 

a = (2,3,0,0,4,3) 
y = list(accumulate(a, lambda x,y: (x+y)*0.95)) 
# [2, 4.75, 4.5125, 4.286875, 7.87253125, 10.3289046875] 
0

Numba vectorize लिए एक आसान तरीका एक समारोह, बनाने प्रदान करता है एक universal function (इस प्रकार ufunc.accumulate उपलब्ध कराने):

import numpy 
from numba import vectorize, float64 

@vectorize([float64(float64, float64)]) 
def f(x, y): 
    return 0.95 * (x + y) 

>>> a = numpy.array([2, 3, 0, 0, 4, 3]) 
>>> f.accumulate(a) 
array([ 2.  , 4.75  , 4.5125 , 4.286875 , 
     7.87253125, 10.32890469]) 
संबंधित मुद्दे