我有一个带有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)
如何更快地完成此操作,即如何从单热编码中获取布尔掩码?
答案 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