Python:将分组均值分配给1-D数组

Shi*_*ari 3 python arrays numpy

假设我有2个数组:

x    = [2, 4, 1, 7, 3, 9, 2, 5, 5, 1]
flag = [0, 1, 0, 2, 1, 1, 2, 0, 0, 2]
Run Code Online (Sandbox Code Playgroud)

flag数组表示每个元素x属于哪个"组" .如何x用相应值k的所有元素的平均值替换(例如,标记值)的每个元素?xflagk

经过这样的改造,x看起来像:

x    = [3.25, 5.33, 3.25, 3.33, 5.33, 5.33, 3.33, 3.25, 3.25, 3.33]
Run Code Online (Sandbox Code Playgroud)

(我可以使用循环来实现这一点,但效率很低.)

unu*_*tbu 5

您可以np.bincount用来计算分组方法:

import numpy as np
x    = np.array([2, 4, 1, 7, 3, 9, 2, 5, 5, 1])
flag = np.array([0, 1, 0, 2, 1, 1, 2, 0, 0, 2])
total = np.bincount(flag, weights=x)
count = np.bincount(flag)
means = (total/count)[flag]
Run Code Online (Sandbox Code Playgroud)

产量

array([ 3.25      ,  5.33333333,  3.25      ,  3.33333333,  5.33333333,
        5.33333333,  3.33333333,  3.25      ,  3.25      ,  3.33333333])
Run Code Online (Sandbox Code Playgroud)

对于更通用的分组统计,还有scipy.stats.binned_statistic 功能.它可以计算分组平均值,中位数,计数,总和,最小值,最大值统计量.它还可以接受统计信息的用户定义函数,但性能(当然)比内置统计信息慢.