Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据匹配的选定列对两个数组进行清理和重新排序的最有效方法_Python_Arrays_Numpy_Filter_Intersection - Fatal编程技术网

Python 根据匹配的选定列对两个数组进行清理和重新排序的最有效方法

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和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列中具有相同的值

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

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.:)