numpy를 사용하여 직접 작성하거나 groupby 기능 (matplotlib.mlab의 rec_groupby 기능을 사용할 수 있지만 훨씬 더 느립니다.보다 강력한 groupby 기능을 보려면 pandas을 참조하십시오)과 사전 마이클 던의 대답은 :
import numpy as np
import random
from matplotlib.mlab import rec_groupby
listA = [random.choice("abcdef") for i in range(20000)]
listB = [20 * random.random() for i in range(20000)]
names = np.array(listA)
values = np.array(listB)
def f_dict(listA, listB):
d = {}
for a, b in zip(listA, listB):
d.setdefault(a, []).append(b)
avg = []
for key in d:
avg.append(sum(d[key])/len(d[key]))
return d.keys(), avg
def f_numpy(names, values):
result_names = np.unique(names)
result_values = np.empty(result_names.shape)
for i, name in enumerate(result_names):
result_values[i] = np.mean(values[names == name])
return result_names, result_values
이 세 가지의 결과입니다
In [2]: f_dict(listA, listB)
Out[2]:
(['a', 'c', 'b', 'e', 'd', 'f'],
[9.9003182717213765,
10.077784850173568,
9.8623915728699636,
9.9790599744319319,
9.8811096512807097,
10.118695410115953])
In [3]: f_numpy(names, values)
Out[3]:
(array(['a', 'b', 'c', 'd', 'e', 'f'],
dtype='|S1'),
array([ 9.90031827, 9.86239157, 10.07778485, 9.88110965,
9.97905997, 10.11869541]))
In [7]: rec_groupby(struct_array, ('names',), (('values', np.mean, 'resvalues'),))
Out[7]:
rec.array([('a', 9.900318271721376), ('b', 9.862391572869964),
('c', 10.077784850173568), ('d', 9.88110965128071),
('e', 9.979059974431932), ('f', 10.118695410115953)],
dtype=[('names', '|S1'), ('resvalues', '<f8')])
그리고 그 NumPy와 조금 더 빨리이 테스트 것 같다 (및 미리 정의 된 groupby 함수) 훨씬 느린 :
는
In [32]: %timeit f_dict(listA, listB)
10 loops, best of 3: 23 ms per loop
In [33]: %timeit f_numpy(names, values)
100 loops, best of 3: 9.78 ms per loop
In [8]: %timeit rec_groupby(struct_array, ('names',), (('values', np.mean, 'values'),))
1 loops, best of 3: 203 ms per loop
numpy가 그럴 가치가있는 것 같습니다. 귀하의 스크립트가이 150 배를 수행한다면 dict 솔루션은 ~ 2 초의 지연을 초래합니다. –
그러나 타이밍에 나는 목록의 numpy 배열로의 변환을 세지 않았다. 그리고 이것은 numpy (나는 위의 경우에서 그것을 테스트 한 다음 f_numpy가 거의 같은 속도를가집니다 : 19.3ms)에서 약간의 시간 증가를 보완 할 수 있습니다. 어쩌면 목록을 매번 배열로 변환해야하는지 여부에 달려 있습니다. – joris
테스트가 진행되는 한, 전환 목록 -> 배열에 큰 영향을 미치지는 않지만 두 버전 간의 포괄적 인 비교는 실행하지 않았습니다. – Einar