Python 如何将矢量化函数应用于numpy数组的上一个元素?

Python 如何将矢量化函数应用于numpy数组的上一个元素?,python,arrays,numpy,vectorization,Python,Arrays,Numpy,Vectorization,我想应用如下函数: s[i] = a*x[i] + (1 - a)*s[i-1] 其中s和x都是相同长度的数组 我不想使用for循环,因为这些阵列非常大(>50 mil)。我试过这样做 def f(a,x): s = [0]*len(x) s[i] = a*x[i] + (1 - a)*s[i-1] return s 当然,i没有定义,所以这不起作用 有没有一种方法可以使用map或numpy来实现这一点。沿\u轴应用\u或其他矢量化方法 我还没有遇到一种方法,它将函数

我想应用如下函数:

s[i] = a*x[i] + (1 - a)*s[i-1]
其中
s
x
都是相同长度的数组

我不想使用for循环,因为这些阵列非常大(>50 mil)。我试过这样做

def f(a,x):
    s = [0]*len(x)
    s[i] = a*x[i] + (1 - a)*s[i-1]
    return s
当然,
i
没有定义,所以这不起作用

有没有一种方法可以使用
map
numpy来实现这一点。沿\u轴应用\u
或其他矢量化方法

我还没有遇到一种方法,它将函数应用于数组的当前和以前的元素而不使用for循环,这正是我想要了解的

编辑

明确地说,这里是for循环实现,它可以工作,但我想避免

s = [0]*len(x)
a=0.45
for i in range(len(x)):
    s[i] = a*x[i] + (1-a)*s[i-1]

s[0] = x[0] # reset value of s[0]

您可以避免循环,尽管矢量化更像是“为每个值计算所有内容”

这种策略虽然占用了O(n2)内存,但计算量较大。根据具体情况,由于并行性,它可能会更快(我做了类似的事情,消除了TensorFlow中的
tf.while\u loop
,取得了巨大成功),但在这种情况下,它实际上更慢:

x = list(range(1, 101))
a = 0.45
%timeit fun(x, a)
# 31 µs ± 85.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit fun_vec(x, a)
# 147 µs ± 2.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
因此,可以有一个非循环版本,但它更像是一个好奇心,而不是其他任何东西。

正如我在一篇文章中所写,你不能:

除了显式的
for
循环外,没有其他方法(通常)。 这是因为无法在整个系统中并行执行此任务 行(因为每一行都依赖于另一行)

让这更难的是,你可以很容易地生成,例如,看起来很天真的 :
x{n+1}=r*x{n*(1-x{n-1})

只有设法找到一个封闭的方法,你才能找到解决这个问题的方法 形式,本质上消除了递归关系。但这是必须的 对每个递归关系都要做,我敢肯定你不会 即使保证了封闭形式的存在


50k不是很大。。顺便说一句,新的
s[0]
是什么?你的公式只适用于
i>0
吗?是的,它只适用于
s[i-1]
应该是原始
s
中的值,或者是已经更新的上一个条目中的值?你能将计算更改为使用
cumsum
或其他
ufunc
累积方法吗?
x = list(range(1, 101))
a = 0.45
%timeit fun(x, a)
# 31 µs ± 85.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit fun_vec(x, a)
# 147 µs ± 2.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)