使用NumPy reduceat计算基于组的平均值

2024-09-27 07:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

import numpy as np
import pandas as pd
dummies = np.array(pd.get_dummies(list('abdccadab'))) #categorical IV
groupIDs = np.array([10,10,10,10,20,20,30,30,30]) #groups(/strata)
_,idx,tags = np.unique(groupIDs, return_index=1, return_inverse=1)

我知道我们可以对每一组,每一列做加法、乘法等

^{pr2}$

但是有没有办法计算这些垃圾箱的平均值呢?在

np.mean.reduceat和{}不工作,因为

AttributeError: 'function' object has no attribute 'reduceat'

Tags: importnumpypandasgetreturnasnparray
2条回答

numpy_indexed包(免责声明:我是其作者)以单行语句的形式提供了此类功能:

import numpy_indexed as npi
unique_groups, means = npi.group_by(groupIDs).mean(dummies)

对于这种情况(已经排序的键),它提供了线性和矢量化的性能;尽管它比Divakar发布的专门解决方案有更多的额外开销,Divakar已经加入了这一假设。但这可能是一个更好的选择,这取决于您如何衡量可维护性、自我文档性和通用性。在

使用np.add.reduceat根据间隔移位idx得到数据数组dummies的每列求和,然后除以用np.bincount-

np.add.reduceat(dummies, idx, axis=0)/np.bincount(tags)[:,None]

另一种计算区间长度的方法是直接使用idx-

^{pr2}$

同样,我们可以避免使用np.unique来得到idx,如下-

^{3}$

相关问题 更多 >

    热门问题