NumPy中的cumsum功能可以在添加时衰减吗?

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)

在添加下一个值之前,有没有办法cumsumnumpy每行中使用.95衰变?

Die*_*ich 8

你要的是一个简单的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)

  • 我考虑使用`xx = np.array([2,3,0,0,4,3,dtype = np.float64)` (2认同)

Jon*_*nts 5

如果您只处理一维数组,那么缺少 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)


Eri*_*got 1

我认为如果不使用循环,仅在 NumPy 中可以轻松完成此操作。

\n\n

一种基于数组的想法是计算矩阵 M_ij = .95**i * a[Nj] (其中 N 是 a 中的元素数量)。您要查找的数字是通过对角线求和(使用 ij 常数)找到的。您可以使用因此使用多个numpy.diagonal(\xe2\x80\xa6).sum().

\n\n

您概述的旧算法更清晰,而且可能已经相当快了(否则您可以使用 Cython)。

\n\n

在我看来,通过 NumPy 做你想做的事情而不需要一个循环听起来就像魔法一样。向任何能够实现这一目标的人致敬。

\n