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
你可以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)
这是一种做法 -
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)
如果五除向量的长度并且它是连续的那么
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具有优雅地处理非五倍向量的优点。