将Numpy数据聚合到不同的区间中,然后计算总和?

4

我有一个矩阵,长这样:

M = [[1, 200],
 [1.8, 100],
 [2, 500],
 [2.5, 300],
 [3, 400],
 [3.5, 200],
 [5, 200],
 [8, 100]]

我希望按照一个桶的大小(应用于左侧列)对行进行分组,例如对于桶大小为2(第一个桶的值从0-2,第二个桶从2-4,第三个桶从4-6等):

[[1, 200],
 [1.8, 100],
----
 [2, 500],
 [2.5, 300],
 [3, 400],
 [3.5, 200],
----
 [5, 200],
----
 [8, 100]]

然后输出一个新矩阵,其中每个组的右列之和:

[200+100, 500+300+400+200, 200, 100]

什么是基于bin_size边界的每个值求和的有效方法?
2个回答

7

使用 pandas

创建一个 DataFrame,然后使用整数除法来定义你的区间:

import pandas as pd

df = pd.DataFrame(M)
df.groupby(df[0]//2)[1].sum()

#0
#0.0     300
#1.0    1400
#2.0     200
#4.0     100
#Name: 1, dtype: int64

使用.tolist()方法可以获得你想要的输出结果:
df.groupby(df[0]//2)[1].sum().tolist()
#[300, 1400, 200, 100]

使用numpy.bincount

import numpy as np

gp, vals = np.transpose(M)
gp = (gp//2).astype(int)

np.bincount(gp, vals)
#array([ 300., 1400.,  200.,    0.,  100.])

1
感谢!同样的方法也适用于Numpy吗?我想使用Numpy实现。 - Franc Weser
通常情况下,如果无法通过整数除法轻松定义箱子,则还有其他定义箱子的方法;我们在这里只是幸运而已。 - ALollz

3

您可以在这里使用np.digitizescipy.sparse.csr_matrix

bins = [2, 4, 6, 8, 10]
b = np.digitize(M[:, 0], bins)
v = M[:, 1]

现在使用向量化的 groupby,使用 csr_matrix
from scipy import sparse

sparse.csr_matrix(
    (v, b, np.arange(v.shape[0]+1)), (v.shape[0], b.max()+1)
).sum(0)

matrix([[ 300., 1400.,  200.,    0.,  100.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接