나는 uuids가있는 커다란 배열을 갖고 있는데, labels
이라고 부를 수있다. 이제이 배열의 모든 다른 uuid에 대해 uuid가있는 배열의 위치를 나타내는 bool 마스크가 필요합니다. 나중의 계산을 위해 이것을 필요로한다.하나의 핫 인코딩 된 배열을 bool 배열로 캐스팅하는 것이 느리다.
저는 labels
어레이의 원 핫 인코딩을 만들기 위해 팬더 '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)
가 어떻게이 빠르게 만들 수 있습니다, 즉 어떻게 하나의 뜨거운 인코딩에서 내 부울 마스크를 얻을 수 있나요? 부울 값으로 DF로 변환하기 위해 당신이 NumPy와 배열로 변환하고 1로 비교할 수 있습니다에서
당신을 수행 팬더 eval 함수를 사용하는 것도 가능 결과가 사전이 필요합니까? 데이터 프레임을 부울 값으로 변환하는 것은 꽤 빠릅니다 (d = d == 1로 수행). dict로 변환하면 대부분 시간이 걸릴 것입니다. –
'd = d == 1'은 (적어도 내 컴퓨터에서는) dict을 만드는 것만 큼 오래 걸립니다. 이거 해봤 니? – Merlin1896