Calculate the sum of every 5 elements in a python array

Question:

I have a python array in which I want to calculate the sum of every 5 elements. In my case I have the array c with ten elements. (In reality it has a lot more elements.)

c = [1, 0, 0, 0, 0, 2, 0, 0, 0, 0]

So finally I would like to have a new array (c_new) which should show the sum of the first 5 elements, and the second 5 elements

So the result should be that one

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

c_new = [1, 2]

Thank you for your help
Markus

Asked By: Markus

||

Answers:

Heres one way of doing it –

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)]

Result –

[1, 2]
Answered By: hashcode55

You can use np.add.reduceat by passing indices where you want to split and sum:

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])
Answered By: Psidom

If five divides the length of your vector and it is contiguous then

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

It also works if it is non contiguous, but then it is typically less efficient.

Benchmark:

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

So where possible, reshapeing seems a bit faster; reduceat has the advantage of gracefully handling non-multiple-of-five vectors.

Answered By: Paul Panzer

why don’t you use this ?

np.array([np.sum(i, axis = 0) for i in c.reshape(c.shape[0]//5,5,c.shape[1])])
Answered By: 김원중

There are various ways to achieve that. Will leave, below, two options using numpy built-in methods.


Option 1

numpy.sum and numpy.ndarray.reshape as follows

c_sum = np.sum(np.array(c).reshape(-1, 5), axis=1)

[Out]: array([1, 2])

Option 2

Using numpy.vectorize, a custom lambda function, and numpy.arange as follows

c_sum = np.vectorize(lambda x: sum(c[x:x+5]))(np.arange(0, len(c), 5))

[Out]: array([1, 2])
Answered By: Gonçalo Peres
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.