这是我的问题:
我有两组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中的每个项目应用以下函数
答案 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