我有一个Numpy数组,我需要找到M个元素的N个最大乘积子数组。例如,我有一个数组 p = [0.1, 0.2, 0.8, 0.5, 0.7, 0.9, 0.3, 0.5]
而我想找到3个元素的5个最高积子数组。有没有一种 "快速 "的方法?
下面是另一种快速的方法。
import numpy as np
p = [0.1, 0.2, 0.8, 0.5, 0.7, 0.9, 0.3, 0.5]
n = 5
m = 3
# Cumulative product (starting with 1)
pc = np.cumprod(np.r_[1, p])
# Cumulative product of each window
w = pc[m:] / pc[:-m]
# Indices of the first element of top N windows
idx = np.argpartition(w, n)[-n:]
print(idx)
# [1 2 5 4 3]
方法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
. 所以,如果我们需要顶部的 N
递减 prod
值,使用 range(N)
与它。更多信息.
办法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]