Numpy - 为 3d 网格上的所有网格点找到到测试点的 3-d 距离

Numpy - Find 3-d distance to a testpoint for all gridpoints on 3-d grid

我尝试了 np.hypot() 和 np.linalg.norm() 但它们都有一些问题(至少我是如何使用它们的)。

我很确定np.hypot只能计算二维距离。如果我有一个测试点 P (1,1,1) 和一个网格点 G (3,3,3),那么网格点 G 的返回值将类似于:((3-1)^2+( 3-1)^2)^(0.5) = 2.82

我可以直接向上调用 np.hypot,而不必通过网格点循环(我猜循环很慢,因此很糟糕),我得到了这些到测试点的距离值我的 3-d 网格的网格点,但未计算 z 依赖性(即 d 在 (1,2,0) = d 在 (1,2,3):

#crystal_lattice structure
x,y,z = np.linspace(-2,2,5),np.linspace(-2,2,5),np.linspace(-2,2,5)

xx,yy,zz = np.meshgrid(x,y,z)

#testpoint
point = np.array([1,1,1])

d = np.hypot(xx-1,yy-1,zz-1)

用np.linalg.norm,我不知道如何在我的网格上的所有点上按元素计算返回值,传入的参数似乎是一个点A(网格点)和点 B(测试点),但是除了如下循环之外,我想不出任何方法来计算所有网格点:

for i in x:
    for j in y:
        for k in z:
            #not mapped back to a gridpoint, do not know what to do
            d = np.linalg.norm(np.array([i,j,k])-point)

有谁知道如何找到 3d 网格上所有网格点到测试点的真实 3d 距离?

简单的怎么样:

d = np.sqrt((point[0]-xx)**2 + (point[1]-yy)**2 + (point[2]-zz)**2)

这里有一个计算n维向量相互距离的简单函数:

def _distance2(v):
    nrm=np.sum(v**2,axis=0,keepdims=True)
    return nrm+nrm.T-2* v.T @ v

行是点,列是维度,因此在您的情况下,您可以将数据展平。您还可以使用一般的想法将其操作为您的数据所处的任何形式。