消除多余的numpy行

时间:2017-07-10 06:53:03

标签: python numpy

如果我有一个数组

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[:,::-1np.allnp.any的组合,但到目前为止我提出的只是给了True和{{{比较行时每行1}}但这不会区分相似的行。

False

产生j = np.any([np.all(y==x, axis=1) for y in x[:,::-1]], axis=0)

提前致谢。

4 个答案:

答案 0 :(得分:2)

基本上你想要Find Unique Rows,而这些答案大量借用了前两个答案 - 但你需要先对行进行排序以消除不同的顺序。

如果你不关心最后的行顺序,这是一个短路(但比下面慢):

np.vstack({tuple(row) for row in np.sort(arr,-1)})

如果您确实想维护订单,可以将每个已排序的行转换为空对象,并将np.uniquereturn_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行而不是使用np.sort(arr,-1)np.void制作对象数组可能很有吸引力,但这仅适用于行中没有重复值的情况。如果有,则[1,2,2]行将被视为与[1,1,2]行相同 - 两者都为set(1,2)

答案 1 :(得分:1)

获取布尔列表后,您可以使用以下技术获取包含x和y交换值的列表。

要删除相同的行,您可以使用以下块

#This block to remove elements where x and y are swapped provided the list j
j=[True,False..] #Your Boolean List
finalArray=[]
for (bool,value) in zip(j,arr):
    if not bool:
      finalArray.append(value)


#This code to remove same elements
finalArray= [list(x) for x in set(tuple(x) for x in arr)]

答案 2 :(得分:1)

不使用 <ion-slides *ngIf="slides != null" autoplay="3000" loop="true" speed="800" > <ion-slide *ngFor="let slide of slides" > <img [src]="slide.BannerImage"> <div class="con-box"> <h2>{{slide.BannerName}}</h2> <br/> <button ion-button color="btn" (click)="fnGotoNewArrivalList(slide.CollectionID,slide.BannerName)">Order Now</button> </div> </ion-slide> </ion-slides>

的解决方案
numpy

答案 3 :(得分:1)

使用numpy.lexsort例程的解决方案:

import numpy as np

arr = np.array([
    [0,1], [1,2], [2,3], [4,3], [5,6], [3,4], [2,1], [6,7]
])
order = np.lexsort(arr.T)
a = arr[order]    # sorted rows
arr= a[[i for i,r in enumerate(a) if i == len(a)-1 or set(a[i]) != set(a[i+1])]]

print(arr)

输出:

[[0 1]
 [1 2]
 [2 3]
 [3 4]
 [5 6]
 [6 7]]