2017-01-26 6 views
0

私はnumpy配列のリストを持っています。各配列は、バイナリ値のシーケンスである。 [0,1,1,0,1,0]。私はリスト内のすべての配列を比較し、全く同じシーケンスの配列を持つ配列のすべてのインデックスを持つ別のリストを取得したいと思います。Pythonの配列の一意性チェック

たとえば、A=[[0,1,0],[0,0,1],[0,1,0],[1,0,0],[1,0,0]]の場合、B = [[1,3],[2],[4,5]]のようなものを取得したいとします。

私は次のようにループのための二重を使用して一意性または各配列の類似性を確認することができる午前:

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) 

が、その後、私はどのようにグループにして、それらの間に等しい配列のインデックスを知りません別のリスト、配列、行列、または何でも。

アドバイスをいただき、ありがとうございます。

あなたは、単に辞書のアプローチを使用することができ
+1

合計が0なのではありません。これは、2つが等しいことを意味します: '[0,1]'と '[1,0]'を考えてください。ここで、diffは '[-1,1]'で、 '0'までの合計です。 –

+0

@WillemVanOnsem見落としを指摘してくれてありがとう。私は今質問を編集しました。 –

答えて

0

:インデックスが0とここに始めること

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) 

注意、あなたはインデックスは1で開始したい場合、あなたは、単にそれを供給することによって、コードを変更し使用することができます

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)

resultとして生成します:

コールへ
$ 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]] 
0
import numpy_indexed as npi 
npi.group_by(A).split(np.arange(len(A))) 
関連する問題