【问题标题】:Calculate the sum of every 5 elements in a python array计算python数组中每5个元素的总和
【发布时间】: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]

感谢您的帮助 马库斯

【问题讨论】:

标签: python arrays numpy


【解决方案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 来说是非常可悲的! :)
猜你喜欢
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2021-07-19
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2019-08-21
相关资源
最近更新 更多