我有两个点数组:list1 和 list1.shape = [N, 3] 以及 list2 和 list2。形状 = [M, 3]。 N, M内:点的总数,(x, y, z)是3维坐标。
现在我想检查 list1 的每个点与 list2 的每个点是否在 r 的距离内。执行此操作的自然方法是 for 循环:
for i in range(N):
for j in range(M):
if (list1[i, 0] - list2[j, 0])**2 + (list1[i, 1] - list2[j, 1])**2 + (list1[i, 2] - list2[j, 2])**2 < r**2:
''' Return 1 if list1[i] is within list2[j] '''
return True
else:
''' Return 0 if list1[i] is not within list2[j] '''
return False
但是速度太慢了。我可以采用更有效的方法吗?
最佳答案
您可以使用外部操作来计算没有 for 循环的距离矩阵:
s = np.subtract.outer
d_matrix = s(list1[:,0], list2[:,0])**2
d_matrix += s(list1[:,1], list2[:,1])**2
d_matrix += s(list1[:,2], list2[:,2])**2
其中每条线是点 i 到所有点的距离。要使用您的标准找出点 i 是否接近任何点:
a = np.zeros_like(list1[:,0])
a[np.any(d_matrix < r**2, axis=1)] = 1
关于python - 在两个点数组上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22328735/