快速搜索高斯内核中最大值的坐标

时间:2014-03-27 14:19:23

标签: python performance numpy scipy max

我有一个使用scipy.stats.gaussian_kde函数生成2D高斯内核的简单代码。

这里是MWE

def random_data(N):
    # Generate some random data.
    return np.random.uniform(0., 10., N)

# Data lists.
x_data = random_data(10000)
y_data = random_data(10000)

# Obtain the KDE for this region.
kernel = stats.gaussian_kde(np.vstack([x_data, y_data]), bw_method=0.05)

以及结果:

enter image description here

我需要的是获取此KDE中最大值x,y坐标的方法。

对于我可以从各种来源收集的内容,找到最大值的直接方法似乎是在精细网格上评估kernel,然后使用np.argmax来查找它,请参阅下文:< / p>

# define grid.
xmin, xmax = min(x_data), max(x_data)
ymin, ymax = min(y_data), max(y_data)
x, y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([x.ravel(), y.ravel()])

# THIS IS TOO SLOW.
k_pos = kernel(positions)

# Print max value.
print k_pos[np.argmax(k_pos)]

# Print x,y coordinates of max value.
print positions.T[np.argmax(k_pos)]

这个问题是评估内核非常慢,几乎到了不太大的数据集无法使用的程度。

有没有更好的方法来获取最大值的坐标?

也被接受(可能更好,因为它也允许快速绘图):是否有一种更快的方式来评估精细网格中的内核?

1 个答案:

答案 0 :(得分:-1)

np.argmax(kernel)

可能就是你要找的......

请参阅:http://docs.scipy.org/doc/numpy/reference/generated/numpy.argmax.html