在 numpy 中高效移位和滚动,无需 pd.Series

问题描述 投票:0回答:1

考虑下面的代码,它给出了想要的输出:

import numpy as np
import pandas as pd
sumvalues = 2
touchdown = 3
arr = np.array([1, 2, 3, 4, 5, 6, 7])
series = pd.Series(arr)
shifted = pd.Series(np.append(series, np.zeros(touchdown)))
rolled = shifted.rolling(window=sumvalues, min_periods=1).sum().fillna(0).astype(float)[touchdown:]
print(rolled.values)

如您所见,我想将我的值向后移动“着陆”点,然后为每个条目计算前面条目的“总和”的总和。

上面代码的问题是它很慢,例如我们创建一个整个系列对象只是为了执行滚动。是否有任何智能(快速)方法可以实现与上述相同的操作?

尝试使用 numpy roll 函数,但它有点不同,也尝试过 pandas 中的转变,但似乎效率低下。

algorithm numpy numpy-ndarray rolling-computation array-broadcasting
1个回答
0
投票

您可以使用

sliding_window_view

from numpy.lib.stride_tricks import sliding_window_view as swv

sumvalues = 2
touchdown = 3
arr = np.array([1, 2, 3, 4, 5, 6, 7])

swv(np.pad(arr[touchdown-1:], (0, touchdown)), sumvalues).sum(1)

输出:

array([ 7,  9, 11, 13,  7,  0,  0])
© www.soinside.com 2019 - 2024. All rights reserved.