【发布时间】:2021-02-23 14:55:58
【问题描述】:
我有一个很长的 NumPy 数组,其中包含 1_000_000_000 元素,我想在数组中滑动一个 50 元素窗口,并询问窗口中的所有元素是否都是有限的。如果50 元素窗口内的所有元素都是有限的,则返回True(对于该窗口),否则,如果50 元素窗口内的一个或多个元素不是有限的,则返回False(对于该窗口)。继续此评估,直到评估所有窗口。一个很好的方法是:
import numpy as np
def rolling_window(a, window):
a = np.asarray(a)
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
if __name__ == "__main__":
a = np.random.rand(100_000_000) # This is 10x shorter than my real data
w = 50
idx = np.random.randint(0, len(a), size=len(a)//10) # Simulate having np.nan in my array
a[idx] = np.nan
print(np.all(rolling_window(np.isfinite(a), w), axis=1))
但是,当我的数组长度为 1_000_000_000 时,这会很慢。有没有更快的方法来完成这个,而且不需要大量的内存?
【问题讨论】:
-
无限元素的频率/稀疏度是多少?如果它们是稀疏的,最好先取更大的块,只有在存在无限元素时才细分它们
标签: python arrays performance numpy