对 NumPy 数组中的连续值切片求和

Sum slices of consecutive values in a NumPy array

假设我有一个包含 10 个值的 numpy 数组 a。这里只是一个示例情况,尽管我想对长度为 100 的数组重复相同的操作。

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

我想将前 5 个值和后 5 个值相加,依此类推,并将它们存储在一个新的空列表中,比如 b

所以 b 将包含 b = [15,40].

我该怎么做?

试试这个列表理解:

b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)]

它一次从列表中取出 5 个切片,将它们相加并构建一个列表。也适用于长度不是 5 的倍数的列表。

(xrange 在 python3+ 中应该是 range)

你可以使用

import numpy as np

a = np.array([1,2,3,4,5,6,7,8,9,10])
step = 5

for i in range(0,a.shape[0],step):
    print(np.sum(a[i:i+step]))

一种方法是使用 add ufunc 及其 reduceat 方法:

>>> np.add.reduceat(a, [0,5])
array([15, 40])

这会将切片 a[0:5]a[5:] 以及 returns 相加为一个新数组。

如果你想要一个 Python 列表,你可以在返回的数组上调用 tolist()

您可以在该方法中使用任何索引列表(它们不必均匀分布)。例如,如果您希望在长度为 100 的数组上每次切片 5:

>>> b = np.arange(100)
>>> np.add.reduceat(b, range(0, 100, 5))
array([ 10,  35,  60,  85, 110, 135, 160, 185, 210, 235, 260, 285, 310,
   335, 360, 385, 410, 435, 460, 485])

这是(还有)另一个解决方案:

In [3]: a.reshape((2,5)).sum(axis=1)
Out[3]: array([15, 40])

将一维数组重新整形为两行 5 列并对列求和:

In [4]: a.reshape((2,5))
Out[4]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])

每行的总和(对列条目求和)用 axis=1 指定。重塑无需复制数据(也无需修改原始数据 a),因此高效且快速。

在您的特定情况下,计算 5 个连续元素的总和:

a = np.array([1,2,3,4,5,6,7,8,9,10])
print(a.reshape((-1,5)).sum(axis=1))

一般来说,对N[=25执行numpy数组操作oper(例如meanmax) =]连续元素:

print(a.reshape((-1,N)).oper(axis=1))

注意 len(a) 必须能被 N 整除。