una transpuesta sumar recorrer multiplicar matriz matrices funciones elementos ejemplos columnas array agregar python numpy

python - transpuesta - Cómo calcular la suma de todas las columnas de una matriz numpy 2D(de manera eficiente)



sumar columnas de una matriz python (5)

Consulte la documentación de numpy.sum , prestando especial atención al parámetro del axis . Para sumar en columnas:

>>> import numpy as np >>> a = np.arange(12).reshape(4,3) >>> a.sum(axis=0) array([18, 22, 26])

O bien, para sumar las filas:

>>> a.sum(axis=1) array([ 3, 12, 21, 30])

Otras funciones agregadas, como numpy.mean , numpy.cumsum y numpy.std , por ejemplo, también toman el parámetro del axis .

Del Tutorial Tentativo Numpy :

Muchas operaciones únicas, como calcular la suma de todos los elementos de la matriz, se implementan como métodos de la clase ndarray . Por defecto, estas operaciones se aplican a la matriz como si fuera una lista de números, independientemente de su forma. Sin embargo, al especificar el parámetro de axis puede aplicar una operación a lo largo del eje especificado de una matriz:

Digamos que tengo la siguiente matriz numpy 2D que consta de cuatro filas y tres columnas:

>>> a = numpy.arange(12).reshape(4,3) >>> print(a) [[ 0 1 2] [ 3 4 5] [ 6 7 8] [ 9 10 11]]

¿Cuál sería una forma eficiente de generar una matriz 1D que contenga la suma de todas las columnas (como [18, 22, 26] )? ¿Se puede hacer esto sin tener que pasar por todas las columnas?


Entonces, la función de sum NumPy toma un argumento de eje opcional que especifica a lo largo de qué eje le gustaría que se realizara la suma:

>>> a = numpy.arange(12).reshape(4,3) >>> a.sum(0) array([18, 22, 26])

O equivalente:

>>> numpy.sum(a, 0) array([18, 22, 26])


Otras alternativas para sumar las columnas son

numpy.einsum(''ij->j'', a)

y

numpy.dot(a.T, numpy.ones(a.shape[0]))

Si el número de filas y columnas está en el mismo orden de magnitud, todas las posibilidades son más o menos igualmente rápidas:

Sin embargo, si solo hay unas pocas columnas, tanto el einsum como la solución de dot superan significativamente la sum de numpy (tenga en cuenta la escala de registro):

Código para reproducir las tramas:

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[1])) perfplot.show( # 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)'', )


Usa el argumento del axis :

>> numpy.sum(a, axis=0) array([18, 22, 26])


Use numpy.sum . para su caso, es

sum = a.sum(axis=0)