2

这是我的问题:

我有两组 3d 点。让我们称它们为“高斯点”和“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 中的每个项目应用以下功能

在此处输入图像描述

4

1 回答 1

2

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

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

而如果XYZ有形(n, 3)Gausspoints有形(m, 3),那么dist就会有形(n, m),即点与dist[i, j]点之间的距离。XYZ[i]Gausspoints[j]

使用它可能更容易理解scipy.spatial.distance.cdist

from scipy.spatial.distance import cdist

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

但是一旦你有了你的平方距离数组,这就是孩子的游戏:

f = np.sum(np.exp(-dist2), axis=1)
于 2013-08-08T12:42:13.080 回答