首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy聚合成垃圾桶,然后计算和?

Numpy聚合成垃圾桶,然后计算和?
EN

Stack Overflow用户
提问于 2018-10-23 15:53:10
回答 2查看 1.5K关注 0票数 4

我有一个像这样的矩阵:

代码语言:javascript
复制
M = [[1, 200],
 [1.8, 100],
 [2, 500],
 [2.5, 300],
 [3, 400],
 [3.5, 200],
 [5, 200],
 [8, 100]]

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

代码语言:javascript
复制
[[1, 200],
 [1.8, 100],
----
 [2, 500],
 [2.5, 300],
 [3, 400],
 [3.5, 200],
----
 [5, 200],
----
 [8, 100]]

然后为每个组输出一个包含正确列之和的新矩阵:

代码语言:javascript
复制
[200+100, 500+300+400+200, 200, 100]

根据bin_size边界对每个值进行求和的有效方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-23 15:59:39

pandas

创建一个DataFrame,然后使用整数除法来定义回收箱:

代码语言:javascript
复制
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()获得所需的输出:

代码语言:javascript
复制
df.groupby(df[0]//2)[1].sum().tolist()
#[300, 1400, 200, 100]

numpy.bincount

代码语言:javascript
复制
import numpy as np

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

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

Stack Overflow用户

发布于 2018-10-23 16:19:36

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

代码语言:javascript
复制
bins = [2, 4, 6, 8, 10]
b = np.digitize(M[:, 0], bins)
v = M[:, 1]

现在使用向量化的groupby使用csr_matrix

代码语言:javascript
复制
from scipy import sparse

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

代码语言:javascript
复制
matrix([[ 300., 1400.,  200.,    0.,  100.]])
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52953231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档