Skip to main content
 首页 » 编程设计

python之消除多余的 numpy 行

2025年05月04日22Terrylee

如果我有一个数组

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)