计算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

所以在可能的情况下,reshapeing 似乎要快一些; reduceat 具有优雅处理非五向量的优势。

【讨论】:

@Divakar 为什么它的速度这么快? .sum 可以说是最主流的功能。它应该有优化的声音! AFAIK 它避免了很少的检查,但是对于sum 来说是非常可悲的! :)

以上是关于计算python数组中每5个元素的总和的主要内容,如果未能解决你的问题,请参考以下文章

C语言 怎么计算数组中每一个不同元素出现的次数

Python / numpy:对数组的n个元素求和的最有效方法,以便每个输出元素是前n个输入元素的总和?

数组中的最大总和,使得可以在 5 个元素中选择最多 2 个连续的元素

计算组合的有效算法,数组的重复加起来等于给定的总和

如何在javascript或3sum中计算3个元素的总和?

数组中等于 N 的 K 个元素的总和