检查Python中数组的唯一性
我有一个numpy数组列表。每个数组都是一个二进制值序列,例如检查Python中数组的唯一性,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组列表。每个数组都是一个二进制值序列,例如[0,1,1,0,1,0]。我想比较列表中的所有数组,并获得另一个列表,其中数组的所有索引都具有完全相同的数字序列 例如,如果A=[[0,1,0],[0,0,1],[0,1,0],[1,0,0],[1,0,0],[1,0,0]。我想获得类似B=[[1,3],[2],[4,5]。 我能够使用双for循环验证每个数组的唯一性或相似性,如: for i in xrange(len(A)): for j in xrange(i+1,l
[0,1,1,0,1,0]
。我想比较列表中的所有数组,并获得另一个列表,其中数组的所有索引都具有完全相同的数字序列
例如,如果A=[[0,1,0],[0,0,1],[0,1,0],[1,0,0],[1,0,0],[1,0,0]。
我想获得类似B=[[1,3],[2],[4,5]。
我能够使用双for循环验证每个数组的唯一性或相似性,如:
for i in xrange(len(A)):
for j in xrange(i+1,len(A)):
if (A[i]==A[j]).all():
print 'Duplicate of arrays %d and %d' %(i,j)
但是,我不知道如何将数组的索引分组,这些索引在另一个列表、数组、矩阵或任何东西中相等
非常感谢您的建议。您可以简单地使用字典方法:
dic = {}
B = []
for idx,row in enumerate(A):
trow = tuple(row)
if trow not in dic:
dic[trow] = len(dic)
B.append([idx])
else:
B[dic[trow]].append(idx)
请注意,这里的索引以0
开始,如果您希望索引以1
开始,只需将其馈送到枚举(…)
调用即可使用alter代码:
dic = {}
B = []
for idx,row in enumerate(A,1):
trow = tuple(row)
if trow not in dic:
dic[trow] = len(dic)
B.append([idx])
else:
B[dic[trow]].append(idx)
这不是因为两个相等的总和是0:考虑<代码> [0,1] < /代码>和<代码> [1,0] < /代码>。这里的差异是
[-1,1]
,总结为0
@WillemVanOnsem,感谢您指出了这一疏忽。我现在编辑了这个问题。
$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> A=[[0,1,0],[0,0,1],[0,1,0],[1,0,0],[1,0,0]]
>>> dic = {}
>>> B = []
>>> for idx,row in enumerate(A,1):
... trow = tuple(row)
... if trow not in dic:
... dic[trow] = len(dic)
... B.append([idx])
... else:
... B[dic[trow]].append(idx)
...
>>> B
[[1, 3], [2], [4, 5]]
import numpy_indexed as npi
npi.group_by(A).split(np.arange(len(A)))