python - que - numpy tutorial español pdf
¿Cómo funciona el parámetro de eje de NumPy? (4)
¿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 suma de todos los elementos anidados 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 suma 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)
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 elimina una de las dimensiones, obtendrá una cantidad de 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 suma 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 usamos 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 un entendimiento genérico y completo de este importante parámetro
Para comprender el axis
intuitiva, consulte la imagen a continuación (fuente: Departamento de Física, Cornell Uni )
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 en particular. En nuestro ejemplo, 8
corresponde a la longitud del eje 0, mientras que 3
corresponde a la longitud del eje 1 .