【问题标题】:aggregate values of one colum by classes in second column using numpy使用 numpy 按第二列中的类汇总一列的值
【发布时间】:2015-04-24 01:25:51
【问题描述】:

我有一个形状为 N,2 和 N>10000 的 numpy 数组。我是我的第一列,例如第二列中有 6 个类值(例如 0.0,0.2,0.4,0.6,0.8,1.0)我有浮点值。现在我想计算第一列的所有不同类别的第二列的平均值,得到每个类别的 6 个平均值。

是否有一种 numpy 方法可以做到这一点,以避免手动循环,尤其是在 N 非常大的情况下?

【问题讨论】:

  • 这样的问题,你可能想使用pandas,见:pandas.pydata.org/pandas-docs/dev/groupby.html
  • 这是一个“groupby/aggregation”操作。问题是如此接近stackoverflow.com/questions/28597383/… 重复。我在那里提供的pandas 代码也应该在这里工作(medianmean 的明显变化)。您也可以按照那里的建议使用scipy.ndimage.labeled_comprehension,但您必须将第一列转换为整数(例如idx = (5*data[:, 0]).astype(int)
  • 但是如果你不想要任何额外的依赖,@Jaime 的回答是一个不错的选择。
  • labeled_comprehension 方法似乎最适合我的应用程序,因为我可以用其他聚合替换平均值,并且不需要额外的包。非常感谢。

标签: arrays numpy column-aggregation


【解决方案1】:

在纯 numpy 中,您会执行以下操作:

unq, idx, cnt = np.unique(arr[:, 0], return_inverse=True,
                          return_counts=True)
avg = np.bincount(idx, weights=arr[:, 1]) / cnt

【讨论】:

  • 好的,这似乎有效(从 numpy 1.9.x 开始),但只是为了平均。其他聚合(中位数、标准差等)不能这么直接计算。
  • 好吧,如果您要求一种“使用 numpy 计算平均值”的方法,那么您会得到一个使用 numpy 计算平均值的答案也就不足为奇了...... , labeled_comprehension 只是一个隐藏的大胖子 for 循环,请参阅 here。如果你想执行通用聚合功能,要么使用 pandas 内置插件,要么自己在 numpy 中破解它们。
【解决方案2】:

我将 Warren 的答案复制到这里,因为它最好地解决了我的问题,我想检查它是否已解决:

这是一个“groupby/aggregation”操作。问题是这么接近 成为复制品 getting median of particular rows of array based on index。 ...您也可以使用 scipy.ndimage.labeled_comprehension 作为 那里建议,但您必须将第一列转换为 整数(例如 idx = (5*data[:, 0]).astype(int)

我就是这么做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-18
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多