una tutorial transpuesta multiplicar matriz matrices functions funciones español python numpy multidimensional-array flatten numpy-ndarray

python - tutorial - ¿Cuál es la diferencia entre aplanar y ravel en numpy?



numpy tutorial español pdf (3)

import numpy as np y = np.array(((1,2,3),(4,5,6),(7,8,9))) OUTPUT: print(y.flatten()) [1 2 3 4 5 6 7 8 9] print(y.ravel()) [1 2 3 4 5 6 7 8 9]

Ambas funciones devuelven la misma lista. Entonces, ¿cuál es la necesidad de dos funciones diferentes que realicen el mismo trabajo?


Aquí está el espacio de nombres correcto para las funciones:

Ambas funciones devuelven matrices 1D aplanadas que apuntan a las nuevas estructuras de memoria.

import numpy a = numpy.array([[1,2],[3,4]]) r = numpy.ravel(a) f = numpy.ndarray.flatten(a) print(id(a)) print(id(r)) print(id(f)) print(r) print(f) print("/nbase r:", r.base) print("/nbase f:", f.base) ---returns--- 140541099429760 140541099471056 140541099473216 [1 2 3 4] [1 2 3 4] base r: [[1 2] [3 4]] base f: None

En el ejemplo superior:

  • las ubicaciones de memoria de los resultados son diferentes,
  • los resultados se ven iguales
  • aplanar devolvería una copia
  • Ravel devolvería una vista.

¿Cómo verificamos si algo es una copia? Usando el atributo .base del ndarray . Si es una vista, la base será la matriz original; Si es una copia, la base será None .


Como se explica here una diferencia clave es que flatten es un método de un objeto ndarray y, por lo tanto, solo se puede llamar para matrices numpy verdaderas. En contraste, ravel() es una función de nivel de biblioteca y, por lo tanto, se puede invocar en cualquier objeto que se pueda analizar con éxito. Por ejemplo, ravel() funcionará en una lista de ndarrays, mientras que flatten no está disponible para ese tipo de objeto.

@IanH también señala diferencias importantes con el manejo de la memoria en su respuesta.


La API actual es que:

  • flatten siempre devuelve una copia.
  • ravel devuelve una vista de la matriz original siempre que sea posible. Esto no es visible en la salida impresa, pero si modifica la matriz devuelta por ravel, puede modificar las entradas en la matriz original. Si modifica las entradas en una matriz devuelta de flatten, esto nunca sucederá. ravel a menudo será más rápido ya que no se copia memoria, pero debe tener más cuidado al modificar la matriz que devuelve.
  • reshape((-1,)) obtiene una vista cada vez que los pasos de la matriz lo permiten, incluso si eso significa que no siempre obtiene una matriz contigua.