私は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型のマスクを得ることができますか?
はあなたを行いパンダのeval関数を使用することも可能その結果をdictにする必要がありますか?データフレームをブール値に変換するのは非常に高速です(ちょうどd = d == 1とする)、それをdictに変換するのはほとんどの時間がかかります。 –
'd = d == 1'はdictを作成するのと同じくらい時間がかかります(少なくとも私のマシンでは)。これを試しましたか? – Merlin1896