计算python数组中每5个元素的总和
Posted
技术标签:
【中文标题】计算python数组中每5个元素的总和【英文标题】:Calculate the sum of every 5 elements in a python array 【发布时间】:2017-07-15 14:30:42 【问题描述】:我有一个 python 数组,我想在其中计算每 5 个元素的总和。就我而言,我有一个包含十个元素的数组c
。 (实际上它有更多的元素。)
c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]
所以最后我想要一个新数组 (c_new
),它应该显示前 5 个元素和后 5 个元素的总和
所以结果应该是那个
1+0+0+0+0 = 1
2+0+0+0+0 = 2
c_new = [1, 2]
感谢您的帮助 马库斯
【问题讨论】:
这里是pandas系列的一个,应该是适用的-***.com/questions/41485471/… 【参考方案1】:您可以通过传递要拆分和求和的索引来使用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])
【讨论】:
谢谢大家,这真是一个优雅的方法!【参考方案2】:这是一种方法 -
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)]
结果 -
[1, 2]
【讨论】:
我的类似:[sum(x for x in c[i*5:5*(i+1)]) for i in range(len(c)//5)]
但你的更好
我倾向于使用 itertools 文档中的 grouper
配方来处理这种事情,docs.python.org/2/library/itertools.html#recipes - [sum(group) for group in grouper(c, 5, 0)]
虽然在这里可能有点矫枉过正。
itertools 食谱中有一些很棒的东西。【参考方案3】:
如果五除以向量的长度并且它是连续的,那么
np.reshape(c, (-1, 5)).sum(axis=-1)
如果它不是连续的,它也可以工作,但它通常效率较低。
基准测试:
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
所以在可能的情况下,reshape
ing 似乎要快一些; reduceat
具有优雅处理非五向量的优势。
【讨论】:
@Divakar 为什么它的速度这么快?.sum
可以说是最主流的功能。它应该有优化的声音!
AFAIK 它避免了很少的检查,但是对于sum
来说是非常可悲的! :)以上是关于计算python数组中每5个元素的总和的主要内容,如果未能解决你的问题,请参考以下文章
Python / numpy:对数组的n个元素求和的最有效方法,以便每个输出元素是前n个输入元素的总和?