Quelle est la différence entre les aplatir et ravel fonctions de numpy?
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]
À la fois la fonction de retour de la même liste.
Alors qu'est-ce que le besoin de deux fonctions différentes de l'exécution d'un même travail.
- Ravel renvoie une vue sur le tableau existant (parfois, il renvoie une copie). Aplatir renvoie un nouveau tableau.
- Double Possible de Quelle est la différence entre les aplatir et ravel dans numpy?
- Here est une démonstration concrète de la différence subtile.
Vous devez vous connecter pour publier un commentaire.
L'API actuelle est que:
aplatir l'
retourne toujours une copie.ravel
renvoie une vue sur le tableau d'origine chaque fois que possible. Ce n'est pas visible dans la sortie imprimée, mais si vous modifiez le tableau retourné par ravel, il peut modifier les entrées dans le tableau d'origine. Si vous modifiez les entrées dans un tableau retourné par aplatir cela n'arrivera jamais. ravel sera souvent plus rapide car pas de mémoire est copié, mais vous devez être plus prudent sur la modification du tableau, il renvoie.reshape((-1,))
obtient une vue à chaque fois que les progrès de la matrice permettent, même si cela signifie que vous n'avez pas toujours d'obtenir une ligne de tableau.a.flatten()
pour obtenir une copie pour vous,a.ravel()
d'éviter la plupart des copies, mais encore garantir que le tableau retourné est contiguë, eta.reshape((-1,))
pour vraiment avoir une vue à chaque fois que les progrès de la matrice permettent, même si cela signifie que vous n'avez pas toujours d'obtenir une ligne de tableau.ravel
garantit une ligne de tableau, et donc il n'est pas garanti qu'il renvoie d'un point de vue;reshape
renvoie toujours à une vue, de sorte qu'il n'est pas garanti qu'elle retourne une ligne de tableau.reshape(-1)
est équivalent àreshape((-1,))
ravel
? Quelle est l'idée derrière ce nom?Comme expliqué ici une différence clé est que
flatten
est une méthode d'un ndarray objet, et donc ne peut être appelée pour de véritables tableaux numpy. En revancheravel()
est une bibliothèque de niveau de la fonction et, par conséquent, peut être appelé à n'importe quel objet qui peut être analysé. Par exempleravel()
va travailler sur une liste de ndarrays, alors que cette option n'est pas disponible pour ce type d'objet.@IanH souligne également des différences importantes avec la gestion de la mémoire dans sa réponse.
ndarray
'sIci est le bon espace de noms pour les fonctions:
numpy.ndarray.aplatir
numpy.ravel
Les deux fonctions renvoient aplatie tableaux 1D pointant vers les nouvelles structures de la mémoire.
Dans le coin supérieur exemple:
Comment on vérifie si quelque chose est une copie?
À l'aide de la
.base
attribut de landarray
. Si c'est un point de vue, la base sera le tableau d'origine; si c'est une copie, la base seraNone
.