计算python数组中每5个元素的总和

Mar*_*kus 6 python arrays numpy

我有一个python数组,我想在其中计算每5个元素的总和.在我的情况下,我有c十个元素的数组.(实际上它有更多的元素.)

c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

所以最后我想有一个新的array(c_new),它应该显示前5个元素和后5个元素的总和

所以结果应该是那一个

1+0+0+0+0 = 1
2+0+0+0+0 = 2

c_new = [1, 2]
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助Markus

Psi*_*dom 9

你可以np.add.reduceat通过传递你想要拆分和求和的索引来使用:

import numpy as np
c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
np.add.reduceat(c, np.arange(0, len(c), 5))
# array([1, 2])
Run Code Online (Sandbox Code Playgroud)


has*_*e55 6

这是一种做法 -

c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
print [sum(c[i:i+5]) for i in range(0, len(c), 5)]
Run Code Online (Sandbox Code Playgroud)

结果 -

[1, 2]
Run Code Online (Sandbox Code Playgroud)


Pau*_*zer 5

如果五除向量的长度并且它是连续的那么

np.reshape(c, (-1, 5)).sum(axis=-1)
Run Code Online (Sandbox Code Playgroud)

如果它不连续,它也可以工作,但通常效率较低。

基准:

def aredat():
    return np.add.reduceat(c, np.arange(0, len(c), 5))

def reshp():
    np.reshape(c, (-1, 5)).sum(axis=-1)

c = np.random.random(10_000_000)

timeit(aredat, number=100)
3.8516048429883085
timeit(reshp, number=100)
3.09542763303034
Run Code Online (Sandbox Code Playgroud)

因此,在可能的情况下,reshapeing 看起来会更快一些;reduceat具有优雅地处理非五倍向量的优点。