Quelle est la différence entre les fonctions array()
et asarray()
de Numpy? Quand devriez-vous utiliser l'un plutôt que l'autre? Ils semblent générer une sortie identique pour toutes les entrées auxquelles je peux penser.
Etant donné que d’autres questions concernant asanyarray
ou autres routines de création de tableaux sont redirigées vers celle-ci, il est probablement utile d’avoir un bref résumé de ce que chacune d’elles fait.
Les différences concernent principalement le moment où l’entrée doit être restituée telle quelle, par opposition à la création d’un nouveau tableau sous forme de copie.
array
offre une grande variété d’options (la plupart des autres fonctions sont très fines), y compris des indicateurs pour déterminer quand copier. Une explication complète prendrait autant de temps que la documentation (voir Création de tableaux , mais brièvement, voici quelques exemples:
Supposons que a
est un ndarray
et m
est un matrix
et que tous deux ont un dtype
de _float32
_:
np.array(a)
et np.array(m)
vont copier les deux, car c'est le comportement par défaut.np.array(a, copy=False)
et np.array(m, copy=False)
copieront m
mais pas a
, car m
n'est pas un ndarray
.np.array(a, copy=False, subok=True)
et np.array(m, copy=False, subok=True)
ne copieront ni l'un ni l'autre, car m
est un matrix
, qui est une sous-classe de ndarray
.np.array(a, dtype=int, copy=False, subok=True)
copiera les deux, car dtype
n'est pas compatible.La plupart des autres fonctions sont des maquillages minces autour de array
qui contrôlent la copie:
asarray
: L'entrée sera retournée non copiée si et seulement si elle est compatible ndarray
(_copy=False
_).asanyarray
: L'entrée sera retournée non copiée si et seulement si elle est compatible avec une variable ndarray
ou une sous-classe telle que matrix
(_copy=False
_, _subok=True
_).ascontiguousarray
: L'entrée sera retournée non copiée si et seulement si elle est compatible ndarray
dans un ordre C contigu (_copy=False
_, _order='C')
_.asfortranarray
: L'entrée sera retournée non copiée si et seulement si elle est compatible ndarray
dans un ordre Fortran contigu (_copy=False
_, _order='F'
_).require
: L'entrée sera renvoyée non copiée si elle est compatible avec la chaîne d'exigences spécifiée.copy
: l'entrée est toujours copiée.fromiter
: l’entrée est traitée comme une variable (par exemple, vous pouvez construire un tableau à partir d’éléments d’un itérateur, au lieu d’un tableau object
avec l’itérateur); toujours copié.Il existe également des fonctions pratiques, telles que asarray_chkfinite
(mêmes règles de copie que asarray
, mais déclenche ValueError
s'il existe des valeurs nan
ou inf
), ainsi que des constructeurs pour les sous-classes telles que matrix
ou pour des cas spéciaux tels que record array, et bien sûr le constructeur ndarray
(qui vous permet de créer un tableau directement à partir de pas sur une mémoire tampon).
Le définition de asarray
est:
def asarray(a, dtype=None, order=None):
return array(a, dtype, copy=False, order=order)
Donc, c'est comme array
, sauf qu'il a moins d'options, et copy=False
. array
a copy=True
par défaut.
La principale différence est que array
(par défaut) fera une copie de l'objet, alors que asarray
ne le fera pas, sauf si cela est nécessaire.
La différence peut être démontrée par cet exemple:
générer une matrice
>>> A = numpy.matrix(numpy.ones((3,3)))
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
utilisez numpy.array
pour modifier A
. Ne fonctionne pas parce que vous modifiez une copie
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
utilisez numpy.asarray
pour modifier A
. Cela a fonctionné parce que vous modifiez A
lui-même
>>> numpy.asarray(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
J'espère que cela t'aides!
Les différences sont clairement mentionnées dans la documentation de array
et asarray
. Les différences résident dans la liste des arguments et donc dans l’action de la fonction en fonction de ces paramètres.
Les définitions de fonction sont:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
et
numpy.asarray(a, dtype=None, order=None)
Les arguments suivants sont ceux qui peuvent être passés à array
et et non asarray
comme indiqué dans la documentation:
copy: bool, optionnel Si la valeur est true (valeur par défaut), l'objet est copié . Sinon, une copie ne sera faite que si
__array__
renvoie une copie, si obj est une séquence imbriquée ou si une copie est nécessaire pour satisfaire à l'une des autres exigences (type, ordre, etc.).subok: bool, optionnel Si la valeur est True, les sous-classes seront passées , sinon le tableau retourné sera forcé d'être un tableau de classe de base. (défaut).
ndmin: int, facultatif Spécifie le nombre minimal de dimensions que le tableau résultant doit avoir. Ceux-ci seront pré-suspendus à la forme requise pour répondre à cette exigence.
Voici un exemple simple qui peut démontrer la différence.
La principale différence est que array fera une copie des données d'origine et en utilisant un objet différent, nous pouvons modifier les données du tableau d'origine.
import numpy as np
a = np.arange(0.0, 10.2, 0.12)
int_cvr = np.asarray(a, dtype = np.int64)
Le contenu du tableau (a) reste inchangé et nous pouvons néanmoins effectuer toute opération sur les données à l'aide d'un autre objet sans modifier le contenu du tableau d'origine.