如果我有一个数组
arr = [[0,1]
[1,2]
[2,3]
[4,3]
[5,6]
[3,4]
[2,1]
[6,7]]
如何消除可能交换列值的冗余行?在上面的示例中,代码会将数组缩减为
arr = [[0,1]
[1,2]
[2,3]
[4,3]
[5,6]
[6,7]]
我考虑过使用切片 arr[:,::-1、np.all 和 np.any 的组合,但到目前为止,我只是在比较行时为每行提供 True 和 False ,但这不会区分相似的行。
j = np.any([np.all(y==x, axis=1) for y in x[:,::-1]], axis=0)
产生 [False, True, False, True, False, True, True, False]。
提前致谢。
请您参考如下方法:
基本上你想要Find Unique Rows ,并且这些答案大量借鉴了前两个答案 - 但您需要先对行进行排序以消除不同的顺序。
如果您不关心末尾的行顺序,这是最短的方法(但比下面的慢):
np.vstack({tuple(row) for row in np.sort(arr,-1)})
如果你确实想保持顺序,你可以将每个排序的行变成一个空对象并使用 np.unique 和 return_index
b = np.ascontiguousarray(np.sort(arr,-1)).view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[1])))
_, idx = np.unique(b, return_index=True)
unique_arr = arr[idx]
使用 set row-wise 代替 np.sort(arr,-1) 和 np.void 可能很诱人创建一个对象数组,但这仅在行中没有重复值时才有效。如果有,一行 [1,2,2] 将被认为等同于一行 [1,1,2] - 两者都是 设置(1,2)
