如何将 numpy 数组的一行与所有其他行进行比较

How to compare one row of a numpy array to all the other rows

我有一个带有一些坐标(xyz)的 numpy 数组:

coord=np.array([[0.,0.,2.], [0.,1.,3.], [0.,2.,2.], [1.,0.,1.], [1.,1.,3.], [2.,0.,1.], [2.,1.,1.], [3.,0.,1.]])
threshold = 1

我想将此数组的每一行与下一行进行比较。然后,如果满足我的条件,我想打印满足条件的行数。我尝试了以下但它只是比较一行与下一行而不是所有行:

for ind, val in enumerate (coord):
    if coord[ind][1] == coord[ind+1][1] and coord[ind+1][0]-coord[ind][1] < 1.2 * threshold:
        print (ind+13, ind+1+14)

我想从第一行开始检查它与以下所有行。然后我想用下面的所有内容检查第二行,依此类推。在我的情况下,我想说如果当前行与下一行具有相同的 y 值 (coord[:,1]) 并且它们的 x 距离 (coord[ind+1][0]-coord[ind][1]) 不是超过阈值,打印那两对的索引(我的代码称它们为 ind+13ind+1+13,这是不正确的,因为我想将 13 添加到检测到的对的索引中)。最后想打印这样一个结果:

13, 16
14, 17
16, 18
17, 19
18, 20

感谢任何帮助和贡献。

我想你想要的是在你当前正在寻找的值后面的第二个循环:

for ind, val in enumerate (coord):
    if ind < len(coord): 
        for ind1, val1 in enumerate (coord[ind+1:]):
            if val[1] == val1[1] and (abs((val[0] - val1[0])) < (1.2 * threshold)):
                print (ind+13, ind+ind1+14)

在处理 NumPy 数组时,使用 broadcasting 方法通常比 Python 循环更有效。这是使用广播解决您的问题的方法,并生成所需索引的数组:

# Compute all indices that meet the conditions
i, j = np.where(
    (coord[:, 1] == coord[:, np.newaxis, 1]) &
    (abs(coord[:, 0] - coord[:, np.newaxis, 0]) < 1.2 * threshold)
)

# Restrict to where i is before j
i, j = i[i < j], j[i < j]

# Combine and print the indices, with 13 added
print(np.vstack([i, j]).T + 13)
# [[13 16]
#  [14 17]
#  [16 18]
#  [17 19]
#  [18 20]]