Numpy Aggregate Rows и Sum - PullRequest
       0

Numpy Aggregate Rows и Sum

0 голосов
/ 10 ноября 2018

У меня есть матрица Numpy:

M = [[55, 5],
 [56, 3],
 [57, 7],
 [58, 9],
 [59, 3],
 [60, 8],
 [61, 1]] 

Я хочу объединить по group_size (например, в 3 группы):

group_size = math.ceil(M.size/groups) # math.ceil(7/3) = 3

Каждая агрегированная строка имеет левое значение, являющееся первым левым значением из группы, а правое значение является суммой всех правых значений из группы.

Ожидаемый результат:

R = [[55, 15], # 55 first left column value of first group, 15 sum of all right values in group 
 [58, 20], # 58 first left column value of second group, 20 sum of all right values in group
 [61, 1]] # Third group consist only of one row, remainder

Есть ли эффективный способ решить эту проблему с помощью Numpy без циклов?

Ответы [ 4 ]

0 голосов
/ 10 ноября 2018
a = np.array([[2, 3],[5, 6],[7, 9]])
b = numpy.zeros(shape=(len(a[0])))
for i in a:
    b=b+i
    print(b)
0 голосов
/ 10 ноября 2018

Вот один способ с NumPy:

n = 3
x = M[::n, 0]
y = np.add.reduceat(M[:, 1], np.arange(0, M.shape[0], n))

R = np.vstack((x, y)).T

print(R)

array([[55, 15],
       [58, 20],
       [61,  1]])
0 голосов
/ 10 ноября 2018

Решение с использованием Python:

from operator import itemgetter

M = [[55, 5],
     [56, 3],
     [57, 7],
     [58, 9],
     [59, 3],
     [60, 8],
     [61, 1]]
it = (M[e:e+3] for e in range(0, len(M), 3))
print([[e[0][0], sum(map(itemgetter(1), e))] for e in it])

выход

[[55, 15], [58, 20], [61, 1]]
0 голосов
/ 10 ноября 2018

pandas решение должно использоваться agg с first и sum:

group_size = 3
df = pd.DataFrame(M).groupby(np.arange(len(M)) // group_size).agg({0:'first',1:'sum'})
print (df)
    0   1
0  55  15
1  58  20
2  61   1

a = np.array(df.values.tolist())
print(a)
[[55 15]
 [58 20]
 [61  1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...