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