2017-09-18 3 views
0

나는 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로 비교할 수 있습니다에서

+0

당신을 수행 팬더 eval 함수를 사용하는 것도 가능 결과가 사전이 필요합니까? 데이터 프레임을 부울 값으로 변환하는 것은 꽤 빠릅니다 (d = d == 1로 수행). dict로 변환하면 대부분 시간이 걸릴 것입니다. –

+0

'd = d == 1'은 (적어도 내 컴퓨터에서는) dict을 만드는 것만 큼 오래 걸립니다. 이거 해봤 니? – Merlin1896

답변

1

다시 A 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 MS를 저장하기 위해

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

나중의 조회를 위해 어딘가에 원래의 uuid가 필요합니다. 당신의 접근 방식으로, DataFrame의 컬럼은 새로운 인덱스를 얻습니다. 이 방법을 조정할 방법이 있습니까? – Merlin1896

관련 문제