gpt4 book ai didi

python - 通过 bins 在 Numpy 中的向量上应用函数

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:33 27 4
gpt4 key购买 nike

我将如何将聚合函数(例如“sum()”或“max()”)应用于向量中的 bin。

如果我有:

  1. 长度为 N 的值 x 的向量
  2. 长度为 N 的 bin 标签向量 b

使得 b 指示 x 中的每个值属于哪个 bin。对于 b a 中的每个可能值,我想对属于该 bin 的所有 x 值应用聚合函数“func()”。

>> x = [1,2,3,4,5,6]
>> b = ["a","b","a","a","c","c"]

输出应该是 2 个向量(假设聚合函数是乘积函数):

>>(labels, y) = apply_to_bins(values = x, bins = b, func = prod)

labels = ["a","b","c"]
y = [12, 2, 30]

我想在 numpy(或只是 python)中尽可能优雅地执行此操作,因为显然我可以在其上“for 循环”。

最佳答案

pandas groupby 这将是

import pandas as pd

def with_pandas_groupby(func, x, b):
grouped = pd.Series(x).groupby(b)
return grouped.agg(func)

使用OP的例子:

>>> x = [1,2,3,4,5,6]
>>> b = ["a","b","a","a","c","c"]
>>> with_pandas_groupby(np.prod, x, b)
a 12
b 2
c 30

我只是对速度感兴趣,所以我将 with_pandas_groupbysenderle 的答案中给出的一些函数进行了比较.

  • apply_to_bins_groupby

     3 levels,      100 values: 175 us per loop
    3 levels, 1000 values: 1.16 ms per loop
    3 levels, 1000000 values: 1.21 s per loop

    10 levels, 100 values: 304 us per loop
    10 levels, 1000 values: 1.32 ms per loop
    10 levels, 1000000 values: 1.23 s per loop

    26 levels, 100 values: 554 us per loop
    26 levels, 1000 values: 1.59 ms per loop
    26 levels, 1000000 values: 1.27 s per loop
  • apply_to_bins3

     3 levels,      100 values: 136 us per loop
    3 levels, 1000 values: 259 us per loop
    3 levels, 1000000 values: 205 ms per loop

    10 levels, 100 values: 297 us per loop
    10 levels, 1000 values: 447 us per loop
    10 levels, 1000000 values: 262 ms per loop

    26 levels, 100 values: 617 us per loop
    26 levels, 1000 values: 795 us per loop
    26 levels, 1000000 values: 299 ms per loop
  • with_pandas_groupby

     3 levels,      100 values: 365 us per loop
    3 levels, 1000 values: 443 us per loop
    3 levels, 1000000 values: 89.4 ms per loop

    10 levels, 100 values: 369 us per loop
    10 levels, 1000 values: 453 us per loop
    10 levels, 1000000 values: 88.8 ms per loop

    26 levels, 100 values: 382 us per loop
    26 levels, 1000 values: 466 us per loop
    26 levels, 1000000 values: 89.9 ms per loop

所以 pandas 对于大型项目来说是最快的。此外,级别(箱)的数量对计算时间没有太大影响。(请注意,时间是从 numpy 数组开始计算的,并且包括创建 pandas.Series 的时间)

我生成的数据是:

def gen_data(levels, size):
choices = 'abcdefghijklmnopqrstuvwxyz'
levels = np.asarray([l for l in choices[:nlevels]])
index = np.random.random_integers(0, levels.size - 1, size)
b = levels[index]
x = np.arange(1, size + 1)
return x, b

然后像这样在 ipython 中运行基准测试:

In [174]: for nlevels in (3, 10, 26):
.....: for size in (100, 1000, 10e5):
.....: x, b = gen_data(nlevels, size)
.....: print '%2d levels, ' % nlevels, '%7d values:' % size,
.....: %timeit function_to_time(np.prod, x, b)
.....: print

关于python - 通过 bins 在 Numpy 中的向量上应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11668603/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com