«Складывание» массива, свертывание суммированием - PullRequest
0 голосов
/ 22 ноября 2018

Учитывая массив данных, я хотел бы суммировать однородные порции элементов, чтобы сформировать новый, меньший массив.Это похоже на биннинг, но не по частоте.Я не уверен, как еще описать это, кроме как на примере (ниже).

Вопрос : есть ли функция для этого или более чистого подхода (используя numpy / scipy)?Я посмотрел на digitize и histogram, но думаю, что их реализации являются длительными.Я также думал о хитрой индексации, но она мне не подходит и может составить длинную уродливую строку кода.

import numpy as np  

old_data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
bin_size = 3
new_data = np.zeros(int(np.size(old_data) / bin_size))
for ind, val in enumerate(new_data):
    leap = ind*bin_size
    new_data[ind] = 
np.sum(old_data[leap:leap+bin_size])
print(old_data, '->', bin_size, ':', new_data)

# [0 1 2 3 4 5 6 7 8] -> 3 : [ 3. 12. 21.]

1 Ответ

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

Предполагая, что есть целое число ячеек, вы можете сделать это с изменением формы:

old_data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8])
bin_size = 3

new_data = old_data.reshape(-1, bin_size).sum(axis=1)

new_data будет иметь желаемое значение:

array([ 3, 12, 21])

Если bin_size не делится равномерно на old_data.size, вместо этого вы можете использовать resize:

old_data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
bin_size = 3

old_data.resize(old_data.size//bin_size + 1, bin_size)
new_data = old_data.sum(axis=1)

new_data будет иметь значение:

array([ 3, 12, 21, 19])

Использование *У 1018 * есть обратная сторона изменения old_data, поэтому, если вы хотите сохранить old_data, вам, вероятно, следует сделать копию этого до того, как вы сделаете resize.

...