NumPy数组中连续值的总和

时间:2015-04-01 13:14:21

标签: python arrays list numpy sum

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

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

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

因此b将包含b = [15,40]

我该怎么做呢?

5 个答案:

答案 0 :(得分:10)

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

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

这会对切片a[0:5]a[5:]求和并返回一个新数组。

如果你想要一个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])

答案 1 :(得分:4)

试试这个列表理解:

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

从列表中一次获取5个切片,将它们相加并构造一个列表。也适用于长度不超过5的列表。

xrange应该是range在python3 +中)

答案 2 :(得分:4)

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

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),因此效率很高。

答案 3 :(得分:1)

您可以使用

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

答案 4 :(得分:0)

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

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

通常,要对 N 个连续元素执行 numpy 数组操作 oper(例如 meanmax):

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

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