Each Answer to this Q is separated by one/two green lines.
Let’s say I have the following 2D numpy array consisting of four rows and three columns:
>>> a = numpy.arange(12).reshape(4,3) >>> print(a) [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]
What would be an efficient way to generate a 1D array that contains the sum of all columns (like
[18, 22, 26])? Can this be done without having the need to loop through all columns?
Check out the documentation for
numpy.sum, paying particular attention to the
axis parameter. To sum over columns:
>>> import numpy as np >>> a = np.arange(12).reshape(4,3) >>> a.sum(axis=0) array([18, 22, 26])
Or, to sum over rows:
>>> a.sum(axis=1) array([ 3, 12, 21, 30])
From the Tentative Numpy Tutorial:
Many unary operations, such as computing the sum of all the elements
in the array, are implemented as methods of the
default, these operations apply to the array as though it were a list
of numbers, regardless of its shape. However, by specifying the
parameter you can apply an operation along the specified axis of an
Other alternatives for summing the columns are
If the number of rows and columns is in the same order of magnitude, all of the possibilities are roughly equally fast:
If there are only a few columns, however, both the
einsum and the
dot solution significantly outperform numpy’s
sum (note the log-scale):
Code to reproduce the plots:
import numpy import perfplot def numpy_sum(a): return numpy.sum(a, axis=1) def einsum(a): return numpy.einsum('ij->i', a) def dot_ones(a): return numpy.dot(a, numpy.ones(a.shape)) perfplot.save( "out1.png", # setup=lambda n: numpy.random.rand(n, n), setup=lambda n: numpy.random.rand(n, 3), n_range=[2**k for k in range(15)], kernels=[numpy_sum, einsum, dot_ones], logx=True, logy=True, xlabel="len(a)", )
>> numpy.sum(a, axis=0) array([18, 22, 26])
sum function takes an optional axis argument that specifies along which axis you would like the sum performed:
>>> a = numpy.arange(12).reshape(4,3) >>> a.sum(0) array([18, 22, 26])
>>> numpy.sum(a, 0) array([18, 22, 26])
should solve the problem. It is a 2d
np.array and you will get the sum of all column.
axis=0 is the dimension that points downwards and
axis=1 the one that points to the right.