簡體   English   中英

使用 Numpy 在數組中找到彼此之間足夠距離的最大點的有效方法

[英]Effective way to find the maximum points in an array with sufficent distance from each other with Numpy

我有一個數字數組(如時間序列),我想要一定數量的高值。 高值(局部最大值)應該彼此相距足夠遠。 我的解決方案:

  1. 在整個數組中找到最大值
  2. 清除最大值周圍的周圍(用任何小值覆蓋值)
  3. 重復

編碼:

import numpy as np
import matplotlib.pylab as plt


MIN_DIST = 4
TO_FIND = 2

np.random.seed(103)

x = np.random.normal(0, 1, 20)
x[2] = 4
x[3] = 4.1
x[13] = 3.9



plt.plot(x)
plt.show()


locs = []
for idx in range(TO_FIND):
    loc = x.argmax()
    x[max(0,loc-MIN_DIST):min(loc+MIN_DIST,len(x))] = -2
    locs.append(loc)


print(locs)

在此處輸入圖像描述

打印正確答案 = 3, 13

在上面的示例中,有兩個“太接近的值”——索引 2 和 3——因此它們應該只計算一次,作為索引 3 的最大值(較大的值)。 我想找到的第二個最大值在索引 13 處。

提供的代碼運行良好。 但是,我覺得這樣做真的很愚蠢。 是否有任何關於如何以更便宜的方式實現它的 numpy 或數學技巧(甚至是骯臟的棘手計數)?

與 scipy.signal find_peaks 的業余比較:

import numpy as np
import matplotlib.pylab as plt
import time
from scipy.signal import find_peaks

N = 10000
MIN_DIST = 4
TO_FIND = 2

t1 = 0
t2 = 0

correct = []
for k in range(N):
    y = np.random.normal(0, 1, 10000)
    y[3] = 5
    y[4] = 5.1
    y[11] = 4.9

#     plt.plot(y)
#     plt.show()

    t0 = time.time()
    peaks, _ = find_peaks(y, distance=MIN_DIST)
    t1 += time.time() - t0

    t0 = time.time()
    x = y.copy()
    locs = []
    for idx in range(TO_FIND):
        loc = x.argmax()
        x[max(0,loc-MIN_DIST):min(loc+MIN_DIST,len(x))] = -2
        locs.append(loc)
    t2 += time.time() - t0

    same_answers = all([a == b for a, b in zip(locs, peaks[:TO_FIND])])

    correct.append(same_answers)

print("Correct (same answers):", all(correct))
print("find_peaks:", t1)
print("default:", t2)

find_peaks 似乎有點慢:

正確(相同答案):正確

find_peaks: 3.137294292449951

默認值:0.8532450199127197

此外,如果我刪除“假樣本”並且最大值不那么清楚,結果就不一樣了。

我建議您使用 scipy 的解決方案

from scipy.signal import find_peaks

np.random.seed(103)

x = np.random.normal(0, 1, 20)
x[2] = 4
x[3] = 4.1
x[13] = 3.9

MIN_DIST = 4
peaks, _ = find_peaks(x, distance=MIN_DIST, height=3)
peaks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM