2016-12-01 12 views
2

私は、SQL検索のようなタスクを持っています。同じ要素を見つけるためにnumpyの配列を2つ一致させよう

ID1, z, e, PA, n 

ID2によって同定下記1Dアレイ(約150万要素)を含む別の「表」:

私は、次の1Dアレイ ID1によって同定した(約100万要素)を含む「表」を有します
ID2, RA, DEC 

私はID, z, e, PA, n, RA, DECを含む別の「テーブル」を形成するために一般的なものを見つけるために、ID1ID2をマッチさせたいです。 ID1のほとんどの要素はID2にありますが、それ以外の場合はnumpy.in1d(ID1,ID2)を使用して解決することができます。誰でもこの作業を迅速に実行できますか?例えば

ID1, z, e, PA, n 
101, 1.0, 1.2, 1.5, 1.8 
104, 1.5, 1.8, 2.2, 3.1 
105, 1.4, 2.0, 3.3, 2.8 

ID2, RA, DEC 
101, 4.5, 10.5 
107, 90.1, 55.5 
102, 30.5, 3.3 
103, 60.1, 40.6 
104, 10.8, 5.6 

出力は

ID, z, e, PA, n, RA, DEC 
101, 1.0, 1.2, 1.5, 1.8, 4.5, 10.5 
104, 1.5, 1.8, 2.2, 3.1, 10.8, 5.6 
+0

実行可能なサンプルと予想されるo/pを追加しますか? – Divakar

+1

pandasは、マージ/結合データセットの表示に適しています。http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html – cel

答えて

1

さてあなたは、私たちは2を持っているであろうように、二つの配列/テーブルの最初の列のためのスワップの場所でnp.in1dを使用することができますする必要があります選択のために配列にインデックスを付けるマスク。その後、単純に結果をスタック -

mask1 = np.in1d(a[:,0], b[:,0]) 
mask2 = np.in1d(b[:,0], a[:,0]) 
out = np.column_stack((a[mask1], b[mask2,1:])) 

のサンプル実行を -

インデックス付きの要素が実際にあるならば、チェック、ソートされ、あなたがソートされた検索を行うことができ、あなたの第二のテーブル、テーブルBを仮定し
In [44]: a 
Out[44]: 
array([[ 101. , 1. , 1.2, 1.5, 1.8], 
     [ 104. , 1.5, 1.8, 2.2, 3.1], 
     [ 105. , 1.4, 2. , 3.3, 2.8]]) 

In [45]: b 
Out[45]: 
array([[ 101. , 4.5, 10.5], 
     [ 102. , 30.5, 3.3], 
     [ 103. , 60.1, 40.6], 
     [ 104. , 10.8, 5.6], 
     [ 107. , 90.1, 55.5]]) 

In [46]: mask1 = np.in1d(a[:,0], b[:,0]) 

In [47]: mask2 = np.in1d(b[:,0], a[:,0]) 

In [48]: np.column_stack((a[mask1], b[mask2,1:])) 
Out[48]: 
array([[ 101. , 1. , 1.2, 1.5, 1.8, 4.5, 10.5], 
     [ 104. , 1.5, 1.8, 2.2, 3.1, 10.8, 5.6]]) 
+0

ありがとう、ありがとうございます。実際に私が一致させたいのは 'ID'です。私は 'mask1 = np.in1d(ID1、ID2)'と 'mask2 = np.in1d(ID2、ID1)'のようにしようとしましたが、 'ID1 [mask1]'は 'ID2 [mask2]'とサイズが異なります。なぜこれが起こるのか知っていますか? –

+0

@HuanianZhang ID1とID2がID配列の場合、それは起こりません。あなたは1Dアレイであると確信していますか? – Divakar

+0

ありがとうございます。 'ID1'と' ID2'は一意ではないと思います。 'ID1 [mask1]'と 'ID2 [mask2]'とのサイズが異なる理由を説明してくれるいくつかの繰り返し要素があります。それらは1D配列ですが、要素は18桁の整数です。 –

1

見つかった:

idx = np.searchsorted(B[:-1, 0], A[:, 0]) 
found = A[:, 0] == B[idx, 0] 
np.hstack((A[found, :], B[idx[found], 1:])) 

結果:

array([[ 101. , 1. , 1.2, 1.5, 1.8, 4.5, 10.5], 
     [ 104. , 1.5, 1.8, 2.2, 3.1, 10.8, 5.6]]) 

Bの索引の最後の要素は、Aの項目がBの最後の要素を超えている場合を単純化するために除外されます。この要素がなければ、戻された索引はBの長さより長くなり、 。

+0

ありがとうございました。実際には 'ID'はソートされていません。そして彼らは18桁の長さのインターガーです。 –

+0

18桁の整数は64ビットに適合しますが、53ビットには適合しないため、キー列は浮動小数点ではなく整数でなければなりません。 Pandasのデータ構造では、混合型配列を使用する方がはるかに簡単です。また、キー列を他のデータと区別して保存することもできます。 – Neapolitan

+0

コードをシンプルにするには、あらかじめID2テーブルをソートしてください。 searchsortedとin1dの両方でソートされたテーブルが必要ですが、in1dは内部的にソートを行います。結合操作を2回以上実行すると、ソートされた表を維持する時間が節約されます。 – Neapolitan

1

利用パンダ:

import pandas as pd 

id1 = pd.read_csv('id1.txt') 
id2 = pd.read_csv('id2.txt') 
df = id1.merge(id2.sort_values(by='ID2').drop_duplicates('ID2').rename(columns={'ID2':'ID1'})) 
print(df) 

が生成されます大規模なデータセットを

ID1 z e PA n RA DEC 
0 101 1.0 1.2 1.5 1.8 4.5 10.5 
1 104 1.5 1.8 2.2 3.1 10.8 5.6 

あなたの場所で物事を行うために必要がある場合があります。drop_duplicatesなし

# [Optional] sort locations and drop duplicates 
id2.sort_values(by='ID2', inplace=True) 
id2.drop_duplicates('ID2', inplace=True) 

# columns that you are merging must have the same name 
id2.rename(columns={'ID2':'ID1'}, inplace=True) 

# perform the merge 
df = id1.merge(id2) 

あなたは1を取得各項目の行:

与える
df = id1.merge(id2.rename(columns={'ID2':'ID1'})) 
print(id2) 
print(df) 

:この溶液は列の異なるタイプを保存することを

ID2 RA DEC 
0 101 4.5 10.5 
1 107 90.1 55.5 
2 102 30.5 3.3 
3 103 60.1 40.6 
4 104 10.8 5.6 
5 103 60.1 40.6 
6 104 10.9 5.6 
    ID1 z e PA n RA DEC 
0 101 1.0 1.2 1.5 1.8 4.5 10.5 
1 104 1.5 1.8 2.2 3.1 10.8 5.6 
2 104 1.5 1.8 2.2 3.1 10.9 5.6 

>>> id1.ID1.dtype 
dtype('int64') 
>>> id1[' z'].dtype 
dtype('float64') 

を使用すると、ヘッダー行のカンマそれらの後にスペースを有しているので空白は列名の一部となり、id1 ['z']を使用して2番目の列を参照する必要があります。 read文を変更することで、これは必要なくなりました。

>>> id1 = pd.read_csv('id1.txt', skipinitialspace=True) 
>>> id1.z.dtype 
dtype('float64') 
+0

重複する要素を削除するには 'np.unique'を使います。 –

+0

'np.unique'のために必要な配列に入れた場合、すべての列は同じフォーマットでなければなりません。これは、64文字を使用して取得した20桁の数字ではなく、ビット整数。 idsが18桁であることを示しているため、倍精度では不十分です。 – Neapolitan

関連する問題