2016-03-26 10 views
3

私は、異なる数の行と同じ数の列を持つ2つのnumPy配列を持っています。年、月、日、時間、number_of_satellite、value_of_dataの各配列の構造。すべての配列には異なる種類のデータがあります。Pythonで2つのn次元配列から一致する行を取得する方法は?

これらの2つの配列を比較して、どちらの配列でも共通の行のみを取得するにはどうすればよいですか?比較パラメータは最初の5列で、次に対応する値を持つ2列です。たとえば:

C=[('2015', '1', '1', 0.0, 'G06', 46.29, '0.000') 
('2015', '1', '1', 0.0, 'G12', 444.344, '0.000') 
('2015', '1', '1', 0.0, 'G14', -99.269, '0.000') 
('2015', '1', '1', 0.0, 'G24', 158.488, '0.000') 
('2015', '1', '1', 0.0, 'G25', -60.831, '0.000') 
('2015', '1', '1', 0.0, 'G31', -48.234, '0.000')] 

私はループを使用してそれを行うことができますが、あなたが50000+の数の配列を持っている場合には、効率的なソリューションではありません。

A=[('2015', '1', '1', 0.0, 'G06', 46.29) 
('2015', '1', '1', 0.0, 'G12', 444.344) 
('2015', '1', '1', 0.0, 'G14', -99.269) 
('2015', '1', '1', 0.0, 'G20', 6.874) 
('2015', '1', '1', 0.0, 'G24', 158.488) 
('2015', '1', '1', 0.0, 'G25', -60.831) 
('2015', '1', '1', 0.0, 'G31', -48.234) 
('2015', '1', '1', 0.0, 'R07', -6.243)] 

B=[('2015', '1', '1', 0.0, 'G06', '0.000') 
('2015', '1', '1', 0.0, 'G12', '0.000') 
('2015', '1', '1', 0.0, 'G14', '0.000') 
('2015', '1', '1', 0.0, 'G24', '0.000') 
('2015', '1', '1', 0.0, 'G25', '0.000') 
('2015', '1', '1', 0.0, 'G29', '0.000') 
('2015', '1', '1', 0.0, 'G31', '0.000')] 

結果、私が取得したいと思い行。このため

+0

あなたがnumpyのを使用して結婚していますか?ラベル付けされた表形式のデータを扱うときは、本当に['pandas'](http://pandas.pydata.org)の問題です。 – DSM

+0

あなたの配列は1次元構造であり、n次元ではありません。あなたはどのようにこれをループで行いますか? – hpaulj

+0

注文について何らかの前提を設定できますか?一意? – hpaulj

答えて

2

使用パンダ:'inner'は、キーの値が両方の配列に存在している場合にのみ、マージすることを意味し

import pandas as pd 
a = pd.DataFrame(A) 
b = pd.DataFrame(B) 
c = pd.merge(a, b, 'inner', left_on=[0,1,2,3,4], right_on=[0,1,2,3,4]) 

left_on=[0,1,2,3,4]は、これらの列をキー値として使用することを意味します。 numpyコードの背水で

In: print(c) 
Out: 
     0 1 2 3 4  5_x 5_y 
0 2015 1 1 0 G06 46.290 0.000 
1 2015 1 1 0 G12 444.344 0.000 
2 2015 1 1 0 G14 -99.269 0.000 
3 2015 1 1 0 G24 158.488 0.000 
4 2015 1 1 0 G25 -60.831 0.000 
5 2015 1 1 0 G31 -48.234 0.000 
3

簡単な解決策があり、recfunctions.join_by

それは次のような結果になります。

個別にインポートする必要があり recfunctions現在の組織では

[('2015', '1', '1', 0.0, 'G06', 46.29, 0.0) 
('2015', '1', '1', 0.0, 'G12', 444.344, 0.0) 
('2015', '1', '1', 0.0, 'G14', -99.269, 0.0) 
('2015', '1', '1', 0.0, 'G24', 158.488, 0.0) 
('2015', '1', '1', 0.0, 'G25', -60.831, 0.0) 
('2015', '1', '1', 0.0, 'G31', -48.234, 0.0)] 
[('a', 'S4'), ('b', 'S1'), ('c', 'S1'), ('d', '<f8'), ('e', 'S3'), ('f1', '<f8'), ('f2', '<f8')] 

を生産

import numpy as np 

A=[('2015', '1', '1', 0.0, 'G06', 46.29), 
('2015', '1', '1', 0.0, 'G12', 444.344), 
('2015', '1', '1', 0.0, 'G14', -99.269), 
('2015', '1', '1', 0.0, 'G20', 6.874), 
('2015', '1', '1', 0.0, 'G24', 158.488), 
('2015', '1', '1', 0.0, 'G25', -60.831), 
('2015', '1', '1', 0.0, 'G31', -48.234), 
('2015', '1', '1', 0.0, 'R07', -6.243)] 

B=[('2015', '1', '1', 0.0, 'G06', '0.000'), 
('2015', '1', '1', 0.0, 'G12', '0.000'), 
('2015', '1', '1', 0.0, 'G14', '0.000'), 
('2015', '1', '1', 0.0, 'G24', '0.000'), 
('2015', '1', '1', 0.0, 'G25', '0.000'), 
('2015', '1', '1', 0.0, 'G29', '0.000'), 
('2015', '1', '1', 0.0, 'G31', '0.000')] 

dt=[('a', 'S4'), ('b', 'S1'), ('c', 'S1'), ('d',float), ('e', 'S3'), ('f',float)] 
aA=np.array(A,dt) 
aB=np.array(B,dt) 

flds=list('abcde') 

from numpy.lib import recfunctions 
mrgd = recfunctions.join_by(flds, aA, aB, usemask=False) 
print(mrgd) 
print(mrgd.dtype) 

https://stackoverflow.com/a/33680606/901925

コードの実際の実装方法を確認する必要があります。そして、それ以上のタイミングなしに、どのように速度が等価物と比較されるのかわかりません。pandas。この小さなサンプルでは


recfunctionsは、データフレームを作成するのに必要な時間が含まれている場合は特に、pandasよりも高速です。

In [302]: %%timeit 
    .....: a = pd.DataFrame(A) 
    .....: b = pd.DataFrame(B) 
    .....: c = pd.merge(a, b, 'inner', left_on=[0,1,2,3,4], right_on=[0,1,2,3,4]) 
    .....: 
100 loops, best of 3: 8.01 ms per loop 
In [303]: %%timeit 
    .....: aA=np.array(A,dt) 
    .....: aB=np.array(B,dt) 
    .....: aC=recfunctions.join_by(flds, aA, aB,usemask=False) 
    .....: 
100 loops, best of 3: 3.35 ms per loop 

の両方が(マージしようとしないでください)in1dなどのnumpyの集合演算に比べて遅いです:

In [308]: timeit np.intersect1d(aA[flds],aB[flds]) 
1000 loops, best of 3: 326 µs per loop 
関連する問題