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]
Les deux fonctions renvoient la même liste. Alors, quel est le besoin de deux fonctions différentes effectuant le même travail.
python
numpy
multidimensional-array
flatten
numpy-ndarray
cryptomaniaque
la source
la source
Réponses:
L'API actuelle est la suivante:
flatten
renvoie toujours une copie.ravel
renvoie une vue du tableau d'origine autant que possible. Ce n'est pas visible dans la sortie imprimée, mais si vous modifiez le tableau retourné par ravel, cela peut modifier les entrées du tableau d'origine. Si vous modifiez les entrées dans un tableau renvoyé d'aplatir, cela ne se produira jamais. ravel sera souvent plus rapide car aucune mémoire n'est copiée, mais vous devez être plus prudent lorsque vous modifiez le tableau qu'il renvoie.reshape((-1,))
obtient une vue chaque fois que les enjambées du tableau le permettent même si cela signifie que vous n'obtenez pas toujours un tableau contigu.la source
a.flatten()
d'obtenir une copie à coup sûr,a.ravel()
pour éviter la plupart des copies, mais garantissent toujours que le tableau renvoyé est contigu eta.reshape((-1,))
pour obtenir une vue réelle chaque fois que les pas du tableau le permettent, même si cela signifie que vous n'obtenez pas toujours un tableau contigu.ravel
garantit un tableau contigu, et il n'est donc pas garanti qu'il renvoie une vue;reshape
renvoie toujours une vue, et il n'est donc pas garanti qu'il renvoie un tableau contigu.reshape(-1)
est équivalent àreshape((-1,))
Comme expliqué ici, une différence clé est que:
flatten
est une méthode d'un objet ndarray et ne peut donc être appelée que pour de vrais tableaux numpy.ravel
est une fonction au niveau de la bibliothèque et peut donc être appelée sur n'importe quel objet qui peut être analysé avec succès.Par exemple
ravel
, fonctionnera sur une liste de ndarrays, alors qu'ilflatten
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.
la source
ndarray
'sVoici l'espace de noms correct pour les fonctions:
numpy.ndarray.flatten
numpy.ravel
Les deux fonctions renvoient des tableaux 1D aplatis pointant vers les nouvelles structures de mémoire.
Dans l'exemple supérieur:
Comment vérifions-nous si quelque chose est une copie? Utilisation de l'
.base
attribut dundarray
. S'il s'agit d'une vue, la base sera le tableau d'origine; s'il s'agit d'une copie, la base le seraNone
.la source