用于聚合数组的pythonic方法(numpy与否)

Lou*_*uis 5 python arrays numpy aggregate

我想做一个很好的函数来聚合数组之间的数据(它是一个numpy记录数组,但它不会改变任何东西)

你有一个数据阵列,你想在一个轴之间聚合:例如一个数组,dtype=[(name, (np.str_,8), (job, (np.str_,8), (income, np.uint32)]你希望每个工作的平均收入

我做了这个功能,在示例中它应该被称为 aggregate(data,'job','income',mean)


def aggregate(data, key, value, func):

    data_per_key = {}

    for k,v in zip(data[key], data[value]):

        if k not in data_per_key.keys():

            data_per_key[k]=[]

        data_per_key[k].append(v)

    return [(k,func(data_per_key[k])) for k in data_per_key.keys()]
Run Code Online (Sandbox Code Playgroud)

问题是我发现它不是很好我想把它放在一行:你有什么想法吗?

谢谢你的回答路易斯

PS:我想在通话中保留功能,这样你也可以要求中位数,最小...

Han*_*Gay 5

if k not in data_per_key.keys()可以改写为if k not in data_per_key,但你可以做得更好defaultdict.这是一个defaultdict用于摆脱存在检查的版本:

import collections

def aggregate(data, key, value, func):
    data_per_key = collections.defaultdict(list)
    for k,v in zip(data[key], data[value]):
        data_per_key[k].append(v)

    return [(k,func(data_per_key[k])) for k in data_per_key.keys()]
Run Code Online (Sandbox Code Playgroud)

  • 我将最后一行改为`return [(k,f(v))for k,v in data_per_key.items()]` (3认同)

unu*_*tbu 5

也许您正在寻找的功能是matplotlib.mlab.rec_groupby:

import matplotlib.mlab

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)])

result=matplotlib.mlab.rec_groupby(data, ('job',), (('income',np.mean,'avg_income'),))
Run Code Online (Sandbox Code Playgroud)

产量

('Digger', 4.0)
('Planter', 2.5)
('Waterer', 3.0)
Run Code Online (Sandbox Code Playgroud)

matplotlib.mlab.rec_groupby 返回一个重新排列:

print(result.dtype)
# [('job', '|S7'), ('avg_income', '<f8')]
Run Code Online (Sandbox Code Playgroud)

您可能还有兴趣查看大熊猫,它拥有更多用于处理分组操作的多功能设施.