Python 根据匹配的选定列对两个数组进行清理和重新排序的最有效方法
假设我们有array1和array2,它们都是二维的,并且可能有非唯一的行和不同的行数 我的最终目标是获得两个具有相同形状的数组的清理版本,并对其进行排序,以便对于每一行索引,第2、3和4列中的值相同 在下面,我将描述一个可能的序列来实现这个最终目标,我想知道使用numpy的最有效的方法 1_如果数组1中的行在第2、3、4列中具有类似的值,请将其删除 2_如果array2中有行具有第2、3、4列中的类似值,请将其删除 因此,基于这些列,两个数组都将具有唯一的行 3_然后我想删除两个数组中的行,这些行在第2、3、4列的另一个数组中没有匹配的行 因此,两个数组现在应该具有相同的长度 4_然后我想对数组1进行重新排序,以便使用相同的索引,数组2在第2,3,4列中具有相同的值 -------------编辑:数字示例:Python 根据匹配的选定列对两个数组进行清理和重新排序的最有效方法,python,arrays,numpy,filter,intersection,Python,Arrays,Numpy,Filter,Intersection,假设我们有array1和array2,它们都是二维的,并且可能有非唯一的行和不同的行数 我的最终目标是获得两个具有相同形状的数组的清理版本,并对其进行排序,以便对于每一行索引,第2、3和4列中的值相同 在下面,我将描述一个可能的序列来实现这个最终目标,我想知道使用numpy的最有效的方法 1_如果数组1中的行在第2、3、4列中具有类似的值,请将其删除 2_如果array2中有行具有第2、3、4列中的类似值,请将其删除 因此,基于这些列,两个数组都将具有唯一的行 3_然后我想删除两个数组中的行,这
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列对应项。我有一个答案,尽管不可否认,可能有一个更好的答案
#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]])
一些具有预期结果的真实数据在这里可能会有所帮助。@MBeale done.:)