我有一个像这样的矩阵:
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,等等):
[[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边界对每个值进行求和的有效方法是什么?
发布于 2018-10-23 15:59:39
用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.])发布于 2018-10-23 16:19:36
您可以在这里使用np.digitize和scipy.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.]])https://stackoverflow.com/questions/52953231
复制相似问题