两个点阵列上的For循环

2024-05-12 21:50:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个点数组:list1list1.shape=[N,3]list2list2.shape=[M,3]。在N,M内:点的总数,(x,y,z)是3D中的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

但是速度太慢了。我能用更有效的方法吗?你知道吗


Tags: 方法inforreturnifisrange数组
1条回答
网友
1楼 · 发布于 2024-05-12 21:50:39

可以使用外部操作来计算距离矩阵,而不使用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

相关问题 更多 >