0

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

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

我可以直接调用 np.hypot,而不必循环通过网格点(我猜循环很慢,因此很糟糕),并且我在 3-d 的所有网格点处返回了这些到测试点的距离值meshgrid,但不计算 z 依赖关系(即 (1,2,0) 处的 d = (1,2,3) 处的 d:

#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 距离?

4

2 回答 2

1

简单地说:

d = np.sqrt((point[0]-xx)**2 + (point[1]-yy)**2 + (point[2]-zz)**2)
于 2018-06-12T14:33:54.060 回答
1

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

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

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

于 2018-06-12T14:35:47.970 回答