2017-04-16 18 views
0

最初の行がIDで2行目がそのIDグループの割り当てである2xn配列からタプルのリストを作成しようとしています。グループ割り当てにまとめられたIDのリストを作成したいと思います。例えば2次元配列からタプルのリストを作成する

:上記の例で

array([[ 0., 1., 2., 3., 4., 5., 6.], 
     [ 1., 2., 1., 2., 2., 1., 1.]) 

、ID 0ようにグループ2にグループ1、ID 1に割り当てられています。出力リストは、次のようになります。

a=[(0,2,5,6),(1,3,4)] 

これを行うには誰も創造的で迅速な方法がありますか?

ありがとうございます!

答えて

1

標準(申し訳ありませんが、創造的ではない - しかし、合理的に速い)numpyの方法は、間接的なソートのようになります。

import numpy as np 

data = np.array([[ 0., 1., 2., 3., 4., 5., 6.], 
       [ 1., 2., 1., 2., 2., 1., 1.]]) 

index = np.argsort(data[1], kind='mergesort') # mergesort is a bit 
               # slower than the default 
               # algorithm but is stable, 
               # i.e. if there's a tie 
               # it will preserve order 
# use the index to sort both parts of data 
sorted = data[:, index] 
# the group labels are now in blocks, we can detect the boundaries by 
# shifting by one and looking for mismatch 
split_points = np.where(sorted[1, 1:] != sorted[1, :-1])[0] + 1 

# could convert to int dtype here if desired 
result = map(tuple, np.split(sorted[0], split_points)) 
# That's Python 2. In Python 3 you'd have to explicitly convert to list: 
# result = list(result) 
print(result) 

プリント:

[(0.0, 2.0, 5.0, 6.0), (1.0, 3.0, 4.0)] 
関連する問題