¿Cómo funciona el parámetro de eje de NumPy?

¿Alguien puede explicar exactamente lo que hace el parámetro de axis en NumPy?

Estoy terriblemente confundido.

Estoy tratando de usar la función myArray.sum(axis=num)

Al principio pensé que si la matriz es en sí misma de 3 dimensiones, axis=0 devolverá tres elementos, que consisten en la sum de todos los elementos nesteds en esa misma posición. Si cada dimensión contenía cinco dimensiones, esperaba que axis=1 devolviera un resultado de cinco elementos, y así sucesivamente.

Sin embargo, este no es el caso, y la documentación no hace un buen trabajo ayudándome (usan una matriz de 3x3x3, por lo que es difícil saber qué está pasando)

Esto es lo que hice:

 >>> e array([[[1, 0], [0, 0]], [[1, 1], [1, 0]], [[1, 0], [0, 1]]]) >>> e.sum(axis = 0) array([[3, 1], [1, 1]]) >>> e.sum(axis=1) array([[1, 0], [2, 1], [1, 1]]) >>> e.sum(axis=2) array([[1, 0], [2, 1], [1, 1]]) >>> 

Claramente el resultado no es intuitivo.

Claramente,

 e.shape == (3, 2, 2) 

La sum sobre un eje es una operación de reducción, por lo que el eje especificado desaparece. Por lo tanto,

 e.sum(axis=0).shape == (2, 2) e.sum(axis=1).shape == (3, 2) e.sum(axis=2).shape == (3, 2) 

Para comprender el axis intuitiva, consulte la imagen a continuación (fuente: Departamento de Física, Cornell Uni )

introduzca la descripción de la imagen aquí

La forma de la matriz (booleana) en la figura anterior es shape=(8, 3) . ndarray.shape devolverá una tupla donde las entradas corresponden a la longitud de la dimensión particular. En nuestro ejemplo, 8 corresponde a la longitud del eje 0, mientras que 3 corresponde a la longitud del eje 1 .

Si alguien necesita esta descripción visual:

eje numpy

Hay buenas respuestas para la visualización, sin embargo, podría ayudar a pensar puramente desde una perspectiva analítica.

Puede crear matriz de dimensión arbitraria con numpy. Por ejemplo, aquí hay una matriz de 5 dimensiones:

 >>> a = np.random.rand(2, 3, 4, 5, 6) >>> a.shape (2, 3, 4, 5, 6) 

Puede acceder a cualquier elemento de esta matriz especificando índices. Por ejemplo, aquí está el primer elemento de esta matriz:

 >>> a[0, 0, 0, 0, 0] 0.0038908603263844155 

Ahora, si saca una de las dimensiones, obtendrá varios elementos en esa dimensión:

 >>> a[0, 0, :, 0, 0] array([0.00389086, 0.27394775, 0.26565889, 0.62125279]) 

Cuando aplica una función como sum con el parámetro de axis , esa dimensión se elimina y se crea una matriz de dimensión inferior a la original. Para cada celda en la nueva matriz, el operador obtendrá una lista de elementos y aplicará la función de reducción para obtener un escalador.

 >>> np.sum(a, axis=2).shape (2, 3, 5, 6) 

Ahora puede verificar que el primer elemento de esta matriz es la sum de los elementos anteriores:

 >>> np.sum(a, axis=2)[0, 0, 0, 0] 1.1647502999560164 >>> a[0, 0, :, 0, 0].sum() 1.1647502999560164 

El axis=None tiene un significado especial para aplanar la matriz y aplicar la función en todos los números.

Ahora puede pensar en casos más complejos donde el eje no es solo un número sino una tupla:

 >>> np.sum(a, axis=(2,3)).shape (2, 3, 6) 

Tenga en cuenta que utilizamos la misma técnica para averiguar cómo se realizó esta reducción:

 >>> np.sum(a, axis=(2,3))[0,0,0] 7.889432081931909 >>> a[0, 0, :, :, 0].sum() 7.88943208193191 

También puede usar el mismo razonamiento para agregar dimensión en una matriz en lugar de reducir dimensión:

 >>> x = np.random.rand(3, 4) >>> y = np.random.rand(3, 4) # New dimension is created on specified axis >>> np.stack([x, y], axis=2).shape (3, 4, 2) >>> np.stack([x, y], axis=0).shape (2, 3, 4) # To retrieve item i in stack set i in that axis 

Espero que esto le brinde una comprensión genérica y completa de este importante parámetro.