条件下的numpy部分滚动和

vs3odd8k  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(96)

假设我有两个一维numpy数组A和B,假设它们是由

A = np.array([random.randint(1,100) for _ in range(1000)])

和B的关系。假设这些值是在一段时间内按天数索引的某些价格。
假设我想计算A的部分滚动和,窗口= 20,如下所示:对于每一天,考虑过去20天内B的值,选择B值较大的10天,然后将相应10天内A的值相加。
对于循环,它可能看起来像这样:

result = np.zeros(A.shape)
for i in range(19, len(A)):
    window = list(zip(B[i - 19: i + 1], A[i - 19: i + 1]))
    window.sort(key = lambda x: x[0])
    result[i] = sum(window[1][10:])

这会运行得非常慢,因为numpy数组上的循环很慢。我想知道什么是'numpy'这样做的方式,即。而不用在整个数组上循环。

deikduxw

deikduxw1#

因为还没有人发布任何答案,我有点想出了一个方法来做,我将在这里发布。欢迎任何评论/建议/更好的答案。

from numpy.lib.stride_tricks import sliding_window_view
# create rolling windows of size 20 for both A and B
win_A = sliding_window_view(A, 20)
win_B = sliding_window_view(B, 20)
# compute and compare with the median for each rolling window in B
win_B = win_B > win_B.median(axis = -1)[:, None]
# computed the weighted sum
res = np.mean(win_A * win_B, axis = -1)
# drop the last dimension
res = res.reshape(A.shape[0] - 19)
# add Nan's at the front 
for i in range(19):
    res = np.insert(res, 0, np.nan)

相关问题