如果我有一个数组
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
和{{{比较行时每行1}}但这不会区分相似的行。
False
产生j = np.any([np.all(y==x, axis=1) for y in x[:,::-1]], axis=0)
。
提前致谢。
答案 0 :(得分:2)
基本上你想要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
行而不是使用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]]