2017-09-18 4 views
0

私はuuidsを持つ大きな配列を持っています。それをlabelsと呼ぶことができます。今私は、この配列のすべての異なるuuidに対して、uuidごとに配列内のどの位置にあるかを示すboolマスクが必要です。私は後の計算にこれを必要とします。ブール配列に1ホットコード化配列をキャストするのが遅い

私はlabelsアレイのワンホットエンコーディングを作成するためにpandas 'get_dummies()関数を使用します。結果として得られるデータフレームの各列はブール値配列にキャストされ、辞書に格納されます。エントリーの鍵はuuidです。

get_dummies()機能を持つデータフレームの作成は、必要なだけ速いです。しかし、boolsに列をキャストすることは本当に遅くなる:私はこれより速く行うことができます

import pandas as pd 
import numpy as np 

labels = np.random.randint(0, 10000, 500000) 
%timeit -n 1 -r 1 d = pd.get_dummies(labels); d = {key: d[key].astype(bool) for i, key in enumerate(d.columns.values)} 
>>52.5 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each) 

#smaller dataset 
labels = np.random.randint(0, 10000, 100000) 
%timeit -n 1 -r 1 d = pd.get_dummies(labels); d = {key: d[key].astype(bool) for i, key in enumerate(d.columns.values)} 
>>3.52 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each) 

#without casting to bool 
labels = np.random.randint(0, 10000, 500000) 
%timeit -n 1 -r 1 d = pd.get_dummies(labels); d = {key: d[key] for i, key in enumerate(d.columns.values)} 
>>1.24 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each) 

方法、すなわち、どのように私はワンホットエンコーディングから私のboolean型のマスクを得ることができますか?

+0

はあなたを行いパンダのeval関数を使用することも可能その結果をdictにする必要がありますか?データフレームをブール値に変換するのは非常に高速です(ちょうどd = d == 1とする)、それをdictに変換するのはほとんどの時間がかかります。 –

+0

'd = d == 1'はdictを作成するのと同じくらい時間がかかります(少なくとも私のマシンでは)。これを試しましたか? – Merlin1896

答えて

1

あなたがnumpyの配列に変換し、1と比較して、再度DF作ることができるブール値にDFを変換するために:

%timeit pd.DataFrame(d.values==1) 
1 loop, best of 3: 281 ms per loop 

そのから私の元のアドバイスに従うことではない良いアイデアその内部では、列を反復処理するのでコメント(私はそこにタイミングをしたとき、短い1つのゼロだった)

%timeit d==1 
1 loop, best of 3: 4.83 s per loop 

私はパンダと思うが、ここではるかに遅いです。

編集:

はあなたが行うことができ、元のインデックスを保持する:

e = pd.DataFrame(d.values==1) 
e.index = d.index 

EDIT2: は、別の60ミリ秒に保存し、その

%timeit pd.eval('d==1') 
1 loop, best of 3: 220 ms per loop 
+0

私は元のUUIDを後でルックアップするためのキーとして必要とします。あなたのアプローチでは、DataFrameの列は新しいインデックスを取得します。これを微調整する方法はありますか? – Merlin1896

関連する問題