“堆积”一个数组,通过求和折叠

时间:2018-11-22 02:52:42

标签: python numpy scipy sum bin

给出一个numpy数组,我想对元素的统一块求和以形成一个新的,较小的数组。它类似于装箱,但不是按频率。除了下面的示例,我不确定如何用其他方式来描述它。

问题:是否有此功能或更简洁的方法(使用numpy / scipy)?我研究了digitizehistogram,但认为它们的实现很冗长。我还考虑过狡猾的索引编制,但它超出了我的范围,可能会编写很长的丑陋代码。

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 :(得分:2)

假设箱数是整数,则可以通过重塑来实现:

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])

使用resize有修改old_data的缺点,因此,如果您想保留old_data,则应该在进行{{1} }。