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.
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.
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]
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With