方法#1
我们可以创建滑动窗口,然后执行prod 缩减,最后执行np.argpartition 以得到其中最上面的N -
from skimage.util.shape import view_as_windows
def topN_windowed_prod(a, W, N):
w = view_as_windows(a,W)
return w[w.prod(1).argpartition(-N)[-N:]]
示例运行 -
In [2]: p = np.array([0.1, 0.2, 0.8, 0.5, 0.7, 0.9, 0.3, 0.5])
In [3]: topN_windowed_prod(p, W=3, N=2)
Out[3]:
array([[0.8, 0.5, 0.7],
[0.5, 0.7, 0.9]])
请注意,np.argpartition 不维护订单。因此,如果我们需要按 prod 值的降序排列的顶部 N,请使用 range(N)。 More info.
方法 #2
对于较小的窗口长度,我们可以简单地切片并获得我们想要的结果,就像这样 -
def topN_windowed_prod_with_slicing(a, W, N):
w = view_as_windows(a,W)
L = len(a)-W+1
acc = a[:L].copy()
for i in range(1,W):
acc *= a[i:i+L]
idx = acc.argpartition(-N)[-N:]
return w[idx]