'Piling' 一个数组,求和折叠
'Piling' an Array, Collapse by Summation
给定一个 numpy 数组,我想总结统一的元素块以形成一个新的、更小的数组。它类似于装箱,但不是按频率。除了通过示例(如下)之外,我不确定如何描述它。
问题:是否有适用于此的功能或更简洁的方法(使用 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.]
假设有整数个 bin,您可以通过重塑来完成此操作:
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
你应该在你做之前复制它 resize
.
给定一个 numpy 数组,我想总结统一的元素块以形成一个新的、更小的数组。它类似于装箱,但不是按频率。除了通过示例(如下)之外,我不确定如何描述它。
问题:是否有适用于此的功能或更简洁的方法(使用 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.]
假设有整数个 bin,您可以通过重塑来完成此操作:
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
你应该在你做之前复制它 resize
.