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

Python 高斯核最大值坐标的快速搜索,python,performance,numpy,scipy,max,Python,Performance,Numpy,Scipy,Max,我有一个简单的代码,使用函数生成二维高斯核 以下是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.gauss

我有一个简单的代码,使用函数生成二维高斯核

以下是
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)
结果如下:

我需要的是一种获得KDE中最大值的
x,y
坐标的方法

对于我可以从各种来源收集的信息,找到最大值的直接方法似乎是在精细的网格上计算
内核
,然后使用
np.argmax
来找到它,请参见以下内容:

# 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)]
这样做的问题是,评估内核的速度非常慢,几乎到了不太大的数据集无法使用的程度

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

也被接受(也许更好,因为它还允许快速绘图):有没有更快的方法在精细网格中评估内核

np.argmax(kernel)
可能就是你要找的


请参阅:

没有,已经尝试过了。它返回值
0
。无论如何谢谢你!如果您首先对数据进行装箱,则可以使用卷积和fft。基于statsmodels fft的KDE仅适用于1d,但python中有可用的2d配方。@user333700将数据装箱将导致末端坐标的精度损失。使用
np.unravel_索引(np.argmax(k),k.shape)
从argmax获取坐标