Рассмотрим простую структуру записи массива:Как объединить массив записей NumPy (сумма, мин, макс и т. Д.)?
import numpy as np
ijv_dtype = [
('I', 'i'),
('J', 'i'),
('v', 'd'),
]
ijv = np.array([
(0, 0, 3.3),
(0, 1, 1.1),
(0, 1, 4.4),
(1, 1, 2.2),
], ijv_dtype)
print(ijv) # [(0, 0, 3.3) (0, 1, 1.1) (0, 1, 4.4) (1, 1, 2.2)]
я хотел бы aggregate некоторые статистические данные (суммы, мин, макс, и т.д.) из v
путем группировки уникальных комбинаций I
и J
. Думая из SQL, ожидаемый результат:
select i, j, sum(v) as v from ijv group by i, j;
i | j | v
---+---+-----
0 | 0 | 3.3
0 | 1 | 5.5
1 | 1 | 2.2
(порядок не важен)
Лучшее, что я могу придумать для NumPy некрасиво, и я не уверен, что я заказал результат правильно (хотя, кажется, здесь работает):
# Get unique groups, index and inverse
u_ij, idx_ij, inv_ij = np.unique(ijv[['I', 'J']], return_index=True, return_inverse=True)
# Assemble aggregate
a_ijv = np.zeros(len(u_ij), ijv_dtype)
a_ijv['I'] = u_ij['I']
a_ijv['J'] = u_ij['J']
a_ijv['v'] = [ijv['v'][inv_ij == i].sum() for i in range(len(u_ij))]
print(a_ijv) # [(0, 0, 3.3) (0, 1, 5.5) (1, 1, 2.2)]
Хотелось бы подумать, что есть лучший способ сделать это! Я использую NumPy 1.4.1.
Моя первая попытка будет собирать данные в 'collection.default_dict (list)', используя '(i, j)' кортежи в качестве ключей. Затем я мог бы подготовить необходимую статистику по каждому из списков. – hpaulj