D_C*_*C_A 9 python arrays numpy cumsum
我有一系列的价值观 a = (2,3,0,0,4,3)
y=0
for x in a:
y = (y+x)*.95
Run Code Online (Sandbox Code Playgroud)
在添加下一个值之前,有没有办法cumsum在numpy每行中使用.95衰变?
你要的是一个简单的IIR滤波器.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.")
Run Code Online (Sandbox Code Playgroud)
如果您只处理一维数组,那么缺少 scipy 的便利或为 numpy 编写自定义的 reduce ufunc,那么在 Python 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]
Run Code Online (Sandbox Code Playgroud)
我认为如果不使用循环,仅在 NumPy 中可以轻松完成此操作。
\n\n一种基于数组的想法是计算矩阵 M_ij = .95**i * a[Nj] (其中 N 是 a 中的元素数量)。您要查找的数字是通过对角线求和(使用 ij 常数)找到的。您可以使用因此使用多个numpy.diagonal(\xe2\x80\xa6).sum().
您概述的旧算法更清晰,而且可能已经相当快了(否则您可以使用 Cython)。
\n\n在我看来,通过 NumPy 做你想做的事情而不需要一个循环听起来就像魔法一样。向任何能够实现这一目标的人致敬。
\n