Numpy агрегировать в контейнеры, а затем рассчитать сумму - PullRequest
0 голосов
/ 23 октября 2018

У меня есть матрица, которая выглядит следующим образом:

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 ]

0 голосов
/ 23 октября 2018

Вы можете использовать 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.]])
0 голосов
/ 23 октября 2018

С 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.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...