NumPy数组中连续值的总和

use*_*243 6 python arrays numpy sum list

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

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

我想总结前5个值,然后是第二个5值,依此类推,并将它们存储在一个新的空列表中b.

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

我该怎么做呢?

Ale*_*ley 10

一种方法是使用addufunc及其reduceat方法:

>>> np.add.reduceat(a, [0,5])
array([15, 40])
Run Code Online (Sandbox Code Playgroud)

这会对切片求和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])
Run Code Online (Sandbox Code Playgroud)

  • 当我对较大的数组执行此操作时,我只得到两个值!但我需要获取 20 个值,因为我的数组是 len = 100 (2认同)

xnx*_*xnx 6

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

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

将一维数组重塑为两行,每行5列,然后对各列求和:

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

每行的总和(汇总各列条目)由指定axis=1。重塑不会复制数据(也无需修改原始数据a),因此高效而快速。


Reu*_*ani 1

尝试这个列表理解:

b = [sum(a[current: current+5]) for current in xrange(0, len(a), 5)]
Run Code Online (Sandbox Code Playgroud)

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

xrange应该是rangepython3+)

  • 这效率不高。在使用 np.array 时,您应该尽可能使用 Numpy API,如此处的其他答案所示。我刚刚开始学习如何使用 Numpy,所以我可能会弄错,但根据经验,如果你使用“for”,你可能做错了什么。 (2认同)