我有一个N点(N * 3)的3D坐标数组X,想要计算每对点之间的距离。
我可以通过迭代X并将它们与阈值进行比较来做到这一点。
coords = array([v.xyz for v in vertices])
for vertice in vertices:
tests = np.sum(array(coords - vertice.xyz) ** 2, 1) < threshold
closest = [v for v, t in zip(vertices, tests) if t]
这可以在一次操作中完成吗?我记得10年前的线性代数,无法找到办法。
可能这应该是一个3D数组(点a,点b,轴),然后按axis
维度求和。
编辑我自己找到了解决方案,但它不适用于大数据集。
coords = array([v.xyz for v in vertices])
big = np.repeat(array([coords]), len(coords), 0)
big_same = np.swapaxes(big, 0, 1)
tests = np.sum((big - big_same) ** 2, 0) < thr_square
for v, test_vector in zip(vertices, tests):
v.closest = self.filter(vertices, test_vector)
答案 0 :(得分:2)
使用scipy.spatial.distance
。如果X
是一个n
×3点数组,您可以从
n
×n
距离矩阵
from scipy.spatial import distance
D = distance.squareform(distance.pdist(X))
然后,最接近点i
的是索引为
np.argsort(D[i])[1]
([1]
跳过对角线上的值,将首先返回。)
答案 1 :(得分:0)
我不太确定你在这里问的是什么。如果你计算N点空间中每对点之间的欧几里德距离,那么将结果表示为查找矩阵对我来说是有意义的。所以对于N个点,你会得到一个NxN对称矩阵。元素(3,5)将表示点3和5之间的距离,而元素(2,2)将是点2与其自身(零)之间的距离。我就是这样做的随机点:
import numpy as np
N = 5
coords = np.array([np.random.rand(3) for _ in range(N)])
dist = np.zeros((N, N))
for i in range(N):
for j in range(i, N):
dist[i, j] = np.linalg.norm(coords[i] - coords[j])
dist[j, i] = dist[i, j]
print dist
答案 2 :(得分:0)
如果xyz是带有坐标的数组,那么下面的代码将计算距离矩阵(快速工作直到你有足够的内存来存储N ^ 2距离):
xyz = np.random.uniform(size=(1000,3))
distances = (sum([(xyzs[:,i][:,None]-xyzs[:,i][None,:])**2 for i in range(3)]))**.5