Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Addition of multiple arrays in python

I have a number of arrays that I wish to broadcast into a single array using addition, which I know can be simply done such that:

a = numpy.array([1,2,3])
b = numpy.array9[4,5,6])
sum = a + b
print(sum)

[5,7,9]

However, I can't hardcode it like in this simple example as I will run my script numerous times with a different number of inputs and so will have a different number of arrays each time. Sometimes, I may have a and b, but other times I may have a, c and d but not b etc.

Using a loop I therefore append the arrays I do have into a list, so that I end up with something like:

newlist = [array([1,2,3,...5,4,3]), 
          array([5,7,2,...4,6,7]),
          array([3,6,2,...4,5,9])]

What would be the most pythonic way of getting a single array from the arrays in 'newlist' which is the addition of the arrays within it, such that (from newlist):

sum = [8,15,7,...14,15,19]

The arrays are all the same shape.

like image 596
Nathan Thomas Avatar asked Oct 09 '14 13:10

Nathan Thomas


People also ask

How do you sum two arrays?

The idea is to start traversing both the array simultaneously from the end until we reach the 0th index of either of the array. While traversing each elements of array, add element of both the array and carry from the previous sum. Now store the unit digit of the sum and forward carry for the next index sum.


2 Answers

Stick with Numpy array and use its sum() method:

>>> arr = np.array([[1,2,3,5,4,3], 
          [5,7,2,4,6,7],
          [3,6,2,4,5,9]])
>>> arr.sum(axis=0)
array([ 9, 15,  7, 13, 15, 19])

Of course you can do it with Python lists as well but it is going to be slow:

>>> lst = [[1,2,3,5,4,3], 
          [5,7,2,4,6,7],
          [3,6,2,4,5,9]]
>>> map(sum, zip(*lst))
[9, 15, 7, 13, 15, 19]
like image 126
Ashwini Chaudhary Avatar answered Oct 08 '22 01:10

Ashwini Chaudhary


There is no need to create a 2D array from your pre-existing 1D arrays. It will certainly not be faster than adding them together, e.g. using reduce with np.add:

In [14]: a = [np.random.rand(10) for _ in range(10)]

In [15]: %timeit np.array(a).sum(axis=0)
100000 loops, best of 3: 10.7 us per loop

In [16]: %timeit reduce(np.add, a)
100000 loops, best of 3: 5.24 us per loop

For larger arrays, it is even less advantageous:

In [17]: a = [np.random.rand(1000) for _ in range(1000)]

In [18]: %timeit np.array(a).sum(axis=0)
100 loops, best of 3: 6.26 ms per loop

In [19]: %timeit reduce(np.add, a)
100 loops, best of 3: 2.43 ms per loop

And of course:

In [20]: np.allclose(np.array(a).sum(axis=0), reduce(np.add, a))
Out[20]: True
like image 24
Jaime Avatar answered Oct 08 '22 01:10

Jaime