![](/img/trans.png)
[英]Removing points that are in specific distance from each other in 2D numpy array
[英]Effective way to find the maximum points in an array with sufficent distance from each other with Numpy
我有一個數字數組(如時間序列),我想要一定數量的高值。 高值(局部最大值)應該彼此相距足夠遠。 我的解決方案:
編碼:
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.