如何使用python计算一组3d点的距离?

时间:2015-03-01 03:42:50

标签: python

我有一组3D点,我需要找到每个点与所有其他点的距离。到目前为止,我想出了如下代码来计算两个连续(按照数组的顺序)点之间的距离,但是无法计算出如何计算每个点与所有其他点的距离。每个点将有9个距离(其他9个点),因此10个点总共有45个距离(90个的一半)。到目前为止,我只发现了9个距离。任何想法如何使用python有效地获得所有距离?

import numpy as np
import scipy as sp

rij_mat = np.zeros((9,1),dtype=np.float32) """created a 9x1 matrix for storing 9 distances for 10 points"""

npoints = 10

x = sp.randn(npoints,3)

print "here are the 3-d points..."
print x

for i in xrange(npoints-1):

 rij_mat[i] = np.linalg.norm(x[i+1]-x[i])

print "the distances are..."
print rij_mat

我现在的输出是这样的:

here are the 3-d points...
[[-0.89513316  0.05061497 -1.19045606]
 [ 0.31999847 -0.68013916 -0.14576028]
 [ 0.85442751 -0.64139512  1.70403995]
 [ 0.55855264  0.56652717 -0.17086825]
 [-1.22435021  0.25683649  0.85128921]
 [ 0.80310031  0.82236372 -0.40015387]
 [-1.34356018  1.034942    0.00878305]
 [-0.65347726  1.1697195  -0.45206805]
 [ 0.65714623 -1.07237429 -0.75204526]
 [ 1.17204207  0.89878048 -0.54657068]]
the distances are...
[[ 1.7612313 ]
 [ 1.92584431]
 [ 2.24986649]
 [ 2.07833028]
 [ 2.44877243]
 [ 2.19557977]
 [ 0.84069204]
 [ 2.61432695]
 [ 2.04763007]]

2 个答案:

答案 0 :(得分:1)

两个循环而不是一个循环怎么样?

distances = []
for i in xrange(npoints-1):
    for j in range(i+1, npoints):
        distances.append(np.linalg.norm(x[i]-x[j])

答案 1 :(得分:1)

对于您的每个npoints点,距离都有npoints - 1个其他要比较的点。并且,x[m]x[n]之间的距离与x[n]x[m]之间的距离相同,因此将总距离减半。 itertools包有一个很好的方法来处理这个问题:

import numpy as np
import scipy as sp
import itertools as its

npoints = 10
nCombos = (npoints * (npoints - 1))/2
x = sp.randn(npoints,3)
rij_mat = np.zeros(nCombos)

ii = 0
for i1, i2 in its.combinations(range(npoints), 2):
    rij_mat[ii] = np.linalg.norm(x[i1]-x[i2])
    ii += 1

print "the distances are..."
print rij_mat

如果你是一个非常小心的人,你最后可能会检查ii == nCombos

由于您调用了输出矩阵rij_mat,您是否可能认为它是一个二维矩阵?然后你想要像:

import numpy as np
import scipy as sp
import itertools as its

npoints = 10

x = sp.randn(npoints,3)
rij_mat = np.zeros((npoints, npoints))

for i1, i2 in its.combinations(range(npoints), 2):
    rij_mat[i2, i1] = rij_mat[i1, i2] = np.linalg.norm(x[i1]-x[i2])

print "the distances are..."
print rij_mat