基于密度过滤数组

2024-09-30 16:39:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似下面的示例图,我用数组x中的一组(x,y)值绘制了它

http://bubblebird.com/images/t.png

如您所见,该图像具有4000到5100之间的密集峰值

我确切的问题是,我能通过编程找到这个图最密集的区域吗?
也就是说。。对于数组X,如何找到该图密集的范围?
对于这个数组,它是4000-5100。

为了简单起见,假设数组只有一个密集区域。
感谢你能提出一个伪代码/代码。在


Tags: 代码图像comhttp区域示例png编程
3条回答

您可以计算相邻值之间的绝对差,然后用滑动窗口稍微平滑一下,然后找到区域,其中平滑的绝对差值为最大值的50%。在

使用python(标记中有python),如下所示:

a = ( 10, 11, 9, 10, 18, 5, 20, 6, 15, 10, 9, 11 )

diffs = [abs(i[0]-i[1]) for i in zip(a,a[1:])]
# [1, 2, 1, 8, 13, 15, 14, 9, 5, 1, 2]
maximum = max(diffs)
# 15
result = [i>maximum/2 for i in diffs]
# [False, False, False, True, True, True, True, True, False, False, False]

您可以使用分类算法(例如k-means),将数据拆分为多个簇,并找到权重最大的簇

你可以利用移动窗口上信号的方差。 以下是一个示例(请参阅随附的图表,其中测试信号为红色,加窗方差为绿色,过滤信号为蓝色):

simple example

测试信号生成:

import numpy as np
X = np.arange(200) - 100.  
Y = (np.exp(-(X/10)**2) + np.exp(-((np.abs(X)-50.)/2)**2)/3.) * np.cos(X * 10.)

计算移动窗口方差:

^{pr2}$

得到方差高的指标(这里我选择优于最大方差一半的标准方差。。。您可以根据您的情况进行调整):

idx = np.where(variance > 0.5 * np.max(variance))

X_min = np.min(X[idx])
# -14.0
X_max = np.max(X[idx])
# 15.0

或过滤信号(将低方差点设为零)

Y_modified = np.where(variance > 0.5 * np.max(variance), Y, 0)

相关问题 更多 >