如何查找Numpy数组中M个元素的N个最大乘积子数组?

问题描述 投票:2回答:2

我有一个Numpy数组,我需要找到M个元素的N个最大乘积子数组。例如,我有一个数组 p = [0.1, 0.2, 0.8, 0.5, 0.7, 0.9, 0.3, 0.5] 而我想找到3个元素的5个最高积子数组。有没有一种 "快速 "的方法?

python numpy numpy-ndarray sub-array
2个回答
1
投票

下面是另一种快速的方法。

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
投票

方法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]
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.