2017-01-16 8 views
0

私はPythonで2次元配列のリストを持っています。 2次元アレイごとに、最後の列はIDを示します。今私はIDの(最後の列)に従って配列の行を(おそらくnumpyで)結合したいと思います。列に従って配列を連結する

たとえば、IDが1の行を連結する必要があります。各IDはアレイごとに1回しか表示されません。さらに、ID(最後の列)および2番目の最後の列は、連結配列の最後にのみ書き込まれます(つまり、1回のみ)。

どうすればいいですか?

+2

[サンプルケースを追加](http://stackoverflow.com/help/mcve)? – Divakar

答えて

1

パンダはこの役割だけで良いjoinメソッドを持っています。 ID列がDataFrameのインデックスであれば使いやすいです。 2次元配列のうち2つがadatabdataであり、対応するidがa_idsb_idsであるとします。 (整数データセットだけを扱っていて、IDも整数であれば、numpy配列の最後の列に入ることができますが、numpyは浮動小数点値を扱うことが多く、IDは整数ではない文字列です。 numpyの配列が均質であるため、これらの一般的なケースのうち、idを別々に保つことがより良い、または必要でさえあります。

に参加するには:

ab = a.join(b, lsuffix='a', rsuffix='b', how='outer') 

降伏:

import pandas as pd 

a = pd.DataFrame(adata, index=a_ids) 
b = pd.DataFrame(bdata, index=b_ids) 

は今、あなたのようなものを持っています

これは外部結合です。つまり、1つまたは他のデータセットでIDが発生する状況を含む、すべてのレコードの和集合を返します。両方の入力に一致するだけの場合(またはすべてのデータセットに同等のIDがある場合)は、より密接な交差結合にはhow='inner'を使用できます。

あなたがnumpyの配列バックではなく、DataFrameをしたい場合、それは簡単です:

ab.values 

収量:

array([[-0.68185189, 2.06517757, 0.49309249, 0.56342363], 
     [ 0.18518231, -2.93460494,   nan,   nan], 
     [ 0.06447249, -0.30244753, 2.46605889, -0.28043202], 
     [ 0.62137062, 0.10228747, -0.21668058, -1.07091799], 
     [-0.37247196, -1.5782334 ,   nan,   nan], 
     [-1.0523353 , -0.52960419,   nan,   nan], 
     [ 0.13638979, 0.92173315,   nan,   nan]]) 

そして参加指標のため:

ab.index.values 

を与えます:

array([1001, 1002, 1003, 1004, 1005, 1006, 1007]) 

あなたがPandasを踊り、高レベルの結合操作(データセットが異なるサイズであっても機能する)を利用している間は、含まれるIDは完全に同じではなく、異なるID注文した場合)、NumPy値で作業したい場合は、すぐに値を返します。

決勝ノート、あなたのIDがすでに各データセットの最後の列として埋め込まれるように、あなたはこのようなデータをつかむためにDataFrameコンストラクタを調整し、整数値のためにnumpyのを使用している場合:

a = pd.DataFrame(adata[:, :-1], index=adata[:, -1]) 
b = pd.DataFrame(bdata[:, :-1], index=bdata[:, -1]) 

        # data     ids 
        #^all rows   ^all rows 
        # ^all but last col ^just last col 
0

ここではデータまたはコードが最初に提供されなかったので、pandasを使用して、最小限の例です:@robot'sサンプルデータとnumpyバージョンは、

import numpy as np 
import pandas as pd 

# let the last column in these 2-d arrays be the "ID" column 
arr1 = np.array([[0,0,1,1,1], [0,1,0,0,2], [1,1,1,2,3]]) 
arr2 = np.array([[1,1,1,1,1], [2,1,0,0,2], [2,2,1,2,3]]) 

df1 = pd.DataFrame(arr1) 
df2 = pd.DataFrame(arr2) 

# Again, a minimal example, but the column at index 4 in these 
# DataFrames is the ID column, so we can merge on 4 to get our result 
result = pd.merge(df1, df2, on = 4) 
0

最後の列の値によって行を収集するargsortを使用:

In [28]: arr1 = np.array([[0,0,1,1,1], [0,1,0,0,2], [1,1,1,2,3]]) 
In [29]: arr2 = np.array([[1,1,1,1,1], [2,1,0,0,2], [2,2,1,2,3]]) 
In [30]: arr=np.concatenate((arr1,arr2),axis=0) 
In [31]: arr 
Out[31]: 
array([[0, 0, 1, 1, 1], 
     [0, 1, 0, 0, 2], 
     [1, 1, 1, 2, 3], 
     [1, 1, 1, 1, 1], 
     [2, 1, 0, 0, 2], 
     [2, 2, 1, 2, 3]]) 
In [32]: idx=np.argsort(arr[:,-1]) 
In [33]: idx 
Out[33]: array([0, 3, 1, 4, 2, 5], dtype=int32) 
In [34]: arr[idx,:] 
Out[34]: 
array([[0, 0, 1, 1, 1], 
     [1, 1, 1, 1, 1], 
     [0, 1, 0, 0, 2], 
     [2, 1, 0, 0, 2], 
     [1, 1, 1, 2, 3], 
     [2, 2, 1, 2, 3]]) 

さらに、ID(最後の列)と2番目の最後の列は、共同作業の最後にのみ書き込む必要がありますn配列配列(すなわち、 1回だけ)。

numpyこの配列は、正しく理解できない場合は不可能です。配列の行数は同じでなければなりません。 pandasを使用すると、多レベルの索引付けを構成でき、おそらくこれを索引レベルとしてIDとして使用できます。

より良い結果を得るために、サンプル、入力、結果が必要になります。

===============

私たちは、共通の最後の列に配列にそのソートされた配列を破るためにnp.splitを使用することができます。私は手動で[2,4]を選択しましたが、興味があればデータから派生させることができます。

In [39]: np.split(arr[idx,:],[2,4]) 
Out[39]: 
[array([[0, 0, 1, 1, 1], 
     [1, 1, 1, 1, 1]]), 
array([[0, 1, 0, 0, 2], 
     [2, 1, 0, 0, 2]]), 
array([[1, 1, 1, 2, 3], 
     [2, 2, 1, 2, 3]])]