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?
python
numpy
multidimensional-array
flatten
numpy-ndarray
criptomanía
fuente
fuente
Respuestas:
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.fuente
a.flatten()
debe obtener una copia segura,a.ravel()
para evitar la mayoría de las copias, pero aún así garantizan que la matriz devuelta sea contigua, ya.reshape((-1,))
para obtener realmente una vista siempre que los pasos de la matriz lo permitan, incluso si eso significa que no siempre obtiene una matriz contigua.ravel
garantiza una matriz contigua, por lo que no se garantiza que devuelva una vista;reshape
siempre devuelve una vista, por lo que no se garantiza que devuelva una matriz contigua.reshape(-1)
es equivalente areshape((-1,))
Como se explica aquí, 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.ravel
es una función de nivel de biblioteca y, por lo tanto, se puede invocar en cualquier objeto que se pueda analizar correctamente.Por ejemplo
ravel
, funcionará en una lista de ndarrays, mientrasflatten
no esté disponible para ese tipo de objeto.@IanH también señala diferencias importantes con el manejo de la memoria en su respuesta.
fuente
ndarray
'sAquí está el espacio de nombres correcto para las funciones:
numpy.ndarray.flatten
numpy.ravel
Ambas funciones devuelven matrices 1D aplanadas que apuntan a las nuevas estructuras de memoria.
En el ejemplo superior:
¿Cómo verificamos si algo es una copia? Usando el
.base
atributo de landarray
. Si es una vista, la base será la matriz original; si es una copia, la base lo seráNone
.fuente