将一个热的编码数组转换为bool数组很慢

时间:2017-09-18 13:35:30

标签: python pandas

我有一个带有uuids的大型数组,我们称之为labels。现在我需要在这个数组中的每个不同的uuid一个bool掩码,它显示每个uuid所在的数组中的哪个位置。我需要这个用于以后的计算。

我用熊猫' get_dummies()函数用于创建labels数组的单热编码。然后将结果数据帧的每一列转换为布尔数组并存储在字典中。该条目的关键是uuid。

使用get_dummies()函数创建数据框总是和我需要的一样快。但是将列转换为bool非常慢:

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)

如何更快地完成此操作,即如何从单热编码中获取布尔掩码?

1 个答案:

答案 0 :(得分:1)

为了将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

我认为pandas在这里要慢得多,因为它在内部迭代了列。

编辑:

保留您可以执行的原始索引:

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