将一热编码阵列铸造为Bool数组很慢



我有一个带有uuids的大数组,我们称其为 labels。现在,我需要在此数组中使用一个bool面膜中的每个不同的UUID,向我展示了每个UUID所在的阵列中的哪个位置。我需要以稍后的计算。

我使用pandas的get_dummies()函数来创建labels数组的单次编码。然后将所得数据框架的每一列施加到一个布尔数组中,并存储在字典中。条目的关键是UUID。

使用get_dummies()函数创建数据框总是与我需要的快速。但是将列投放到布尔的速度确实很慢:

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)

我如何更快地使其更快,即如何从一个壁炉编码中获取布尔人面具?

为了将DF转换为布尔值,您可以将其转换为numpy数组并将其比较1并再次制作DF:

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

遵循评论中的原始建议不是一个好主意(当我在那里做时间时,一个零是一个零)

%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毫秒,它也可以使用pandas eval函数

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

最新更新