高斯之和成快速Numpy?

时间:2013-08-08 08:57:12

标签: python numpy

这是我的问题:

我有两组3d点。让我们称它们为“Gausspoints”和“XYZ”。我定义了一个函数,它是高斯之和,其中每个高斯都以一个高斯点为中心。现在我想在XYZ点上评估这个函数:我的方法工作正常,但它很慢。任何想法如何通过更好地利用numpy来加速它?

  def sumgaus(r):
    t=r-Gausspoints
    t=map(np.linalg.norm,t)
    t = -np.power(t,2.0)
    t=np.exp(t)
    res=np.sum(t)
    return res

result=map(sumgaus,XYZ) 

感谢您的帮助

编辑: XYZ N * 3和高斯点的形状是M * 3,其中M,N是不同的整数

Edit2:我想对XYZ中的每个项目应用以下函数

enter image description here

1 个答案:

答案 0 :(得分:2)

棘手的部分是如何在没有任何显式Python循环或映射的情况下对您的点之间的所有差异进行矢量化。您可以通过以下方式使用广播推出自己的实现:

dist2 = XYZ[:, np.newaxis, :] - Gausspoints
dist2 *= dist
dist2 = np.sum(dist, axis=-1)

如果XYZ的形状为(n, 3)Gausspoints的形状为(m, 3),则dist的形状为(n, m),{{1} }}是点dist[i, j]XYZ[i]之间的距离。

使用scipy.spatial.distance.cdist

可能更容易理解
Gausspoints[j]

但是一旦你得到了你的平方距离,这就是孩子的游戏:

from scipy.spatial.distance import cdist

dist2 = cdist(XYZ, Gausspoints)
dist2 *= dist2