Наилучшая производительность достигается при использовании ndimage.mean из scipy . Это будет в два раза быстрее, чем принятый ответ для этого небольшого набора данных, и примерно в 3,5 раза быстрее для больших входных данных:
from scipy import ndimage
data=np.array(
[('Aaron','Digger',1),
('Bill','Planter',2),
('Carl','Waterer',3),
('Darlene','Planter',3),
('Earl','Digger',7)],
dtype=[('name', np.str_,8), ('job', np.str_,8), ('income', np.uint32)])
unique = np.unique(data['job'])
result=np.dstack([unique, ndimage.mean(data['income'], data['job'], unique)])
Сдастся:
array([[['Digger', '4.0'],
['Planter', '2.5'],
['Waterer', '3.0']]],
dtype='|S32')
РЕДАКТИРОВАТЬ: с bincount (быстрее!)
Это примерно в 5 раз быстрее, чем принятый ответ для небольшого примера ввода, если вы повторите данные 100000 раз, это будет примерно в 8,5 раза быстрее:
unique, uniqueInd, uniqueCount = np.unique(data['job'], return_inverse=True, return_counts=True)
means = np.bincount(uniqueInd, data['income'])/uniqueCount
return np.dstack([unique, means])