2016-09-20 4 views
2

У меня есть эти Numpy массивы:Вычислить среднее из массива с определенным значением из другого массива

array1 = np.array([-1, -1, 1, 1, 2, 1, 2, 2]) 
array2 = np.array([34.2, 11.2, 22.1, 78.2, 55.0, 66.87, 33.3, 11.56]) 

Теперь я хочу, чтобы вернуть 2d массив, в котором есть среднее для каждого отличительного значения из array1 так что мой выход будет выглядеть примерно так:

array([[-1, 22.7], 
     [ 1, 55.7], 
     [ 2, 33.3]]) 

есть ли эффективный способ без конкатенации этих 1D массивов в один массив 2D? Благодаря!

ответ

1

Вот подход, использующий np.unique и np.bincount -

# Get unique array1 elems, tag them starting from 0 and get their tag counts 
unq,ids,count = np.unique(array1,return_inverse=True,return_counts=True) 

# Use the tags/IDs to perform ID based summation of array2 elems and 
# thus divide by the ID counts to get ID based average values 
out = np.column_stack((unq,np.bincount(ids,array2)/count)) 

Пример запуска -

In [16]: array1 = np.array([-1, -1, 1, 1, 2, 1, 2, 2]) 
    ...: array2 = np.array([34.2, 11.2, 22.1, 78.2, 55.0, 66.87, 33.3, 11.56]) 
    ...: 

In [18]: out 
Out[18]: 
array([[ -1.  , 22.7  ], 
     [ 1.  , 55.72333333], 
     [ 2.  , 33.28666667]]) 
1

Это типичная операция группирования и numpy_indexed пакет (отказ от ответственности: Я ее автор) предоставляет расширения до нуля для эффективного и сжатого выполнения этих операций:

import numpy_indexed as npi 
groups, means = npi.group_by(array_1).mean(array_2) 

Обратите внимание, что вы можете таким же образом выполнять другие виды сокращений, например, например, медиана.

Смежные вопросы