首页 > 解决方案 > 根据匹配的选定列清理和重新排序两个数组的最有效方法

问题描述

假设我们有 array1 和 array2 都是二维的,并且可能有非唯一的行和不同的行数。

我的最终目标是拥有两个具有相同形状的数组的清理版本,并对其进行排序,以使每个行索引的第 2,3 和 4 列中的值相同。

在下面我描述了一个可能的序列来实现这个最终目标,我想知道使用 numpy 的最有效方法。

1_如果 array1 中的行在第 2、3、4 列中具有相似的值,则删除它们。

2_如果 array2 中有行在第 2,3,4 列中具有相似的值,则将其删除。

因此,基于这些列,两个数组都将具有唯一的行。

3_然后我想删除两个数组中在第 2、3、4 列方面在另一个数组中没有匹配行的行。

所以两个数组现在应该有相同的长度。

4_然后我想对array1 重新排序,以便具有相同索引的array2 在第2、3、4 列中具有相同的值。

-------------编辑:数字示例:

array1 = array([1,4,3, 64356,5435,434],
               [11,46,3, 7356,585,74],
               [51,406,3, 769,5435,24],
               [12,45,5, 656,135,134],
               [112,475,5, 656,1385,134],
               [13,46,  5, 656,1385,19]])


array2 = array([15,44,  5, 656, 1385, 434],
               [165,644,5, 656, 1385, 48],
               [151,436,3, 356, 285,74],
               [521,406,5, 656, 135,24],
               [152,445,54, 56,635,134],
               [1812,757,542, 546,185,1834],
               [72,77,142, 66,65,64],
               [72,727,12, 16,55,634]])

array1_final = array([112,475,5, 656,1385,134],
                     [12,45,  5, 656,135,134]
                ])

array2_final = array([15,44,  5,  656,1385,434],
                     [521,406,5, 656,135,24]
                ])

尽管 array2[0] 和 array2[1] 在它们的 2,3,4 列方面都具有匹配的 array1[4],但只有其中一个保留在最终的 array2 中。同样,array1[5] 被删除。就匹配 2、3、4 列而言,最终数组的顺序相同。其余的被删除,因为它们在另一个数组中没有 2,3,4 列的匹配对应项。

标签: pythonarraysnumpyfilterintersection

解决方案


我有一个答案,尽管无可否认可能会有更好的答案。

#find the unique rows
array1_v,array_i = np.unique(array1[:,[2,3,4]], axis=0, return_index=True)
array2_v,array2_i = np.unique(array2[:,[2,3,4]], axis=0, return_index=True)

#find if the unique rows exist in the other array
array1_in_array2 = [row.tolist() in array2_v.tolist() for row in array1_v] array2_in_array1 = [row.tolist() in array1_v.tolist() for row in array2_v]
array2_in_array1 = [row.tolist() in array1_v.tolist() for row in array2_v] array2_in_array1 = [row.tolist() in array1_v.tolist() for row in array2_v]

#final results
array1_final = array1[array1_i[array1_in_array2]]
array2_final = array2[array2_i[array2_in_array1]]
>>> array1_final
array([[  12,   45,    5,  656,  135,  134],
       [ 112,  475,    5,  656, 1385,  134]])

推荐阅读