Quelle est la différence entre Numpy array()
et les asarray()
fonctions? 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.
Étant donné que d'autres questions sont redirigées vers celle-ci, qui posent des questions sur asanyarray
ou d' autres routines de création de tableaux , il vaut probablement la peine d'avoir un bref résumé de ce que chacun d'eux fait.
Les différences concernent principalement le moment où retourner l'entrée inchangée, par opposition à la création d'un nouveau tableau en tant que copie.
array
offre une grande variété d'options (la plupart des autres fonctions sont des enveloppes minces autour d'elle), y compris des indicateurs pour déterminer quand copier. Une explication complète prendrait aussi longtemps que les documents (voir Création de tableau , mais brièvement, voici quelques exemples:
Supposons a
est un ndarray
, et m
est un matrix
, et ils ont tous les deux un dtype
de float32
:
np.array(a)
et np.array(m)
copiera les deux, car c'est le comportement par défaut.np.array(a, copy=False)
et np.array(m, copy=False)
copiera m
mais pas a
, car ce m
n'est pas un ndarray
.np.array(a, copy=False, subok=True)
et np.array(m, copy=False, subok=True)
ne copiera ni l'un ni l'autre, car m
c'est un matrix
, qui est une sous-classe de ndarray
.np.array(a, dtype=int, copy=False, subok=True)
copiera les deux, car le dtype
n'est pas compatible.La plupart des autres fonctions sont des enveloppes minces autour de array
ce contrôle lors de la copie:
asarray
: L'entrée sera retournée non copiée si c'est un compatible ndarray
( copy=False
).asanyarray
: L'entrée sera retournée non copiée si elle est compatible ndarray
ou sous-classe comme matrix
( copy=False
, subok=True
).ascontiguousarray
: L'entrée sera retournée non copiée si elle est compatible ndarray
dans l'ordre C contigu ( copy=False
, order='C')
.asfortranarray
: L'entrée sera retournée non copiée si elle est compatible ndarray
dans l'ordre Fortran contigu ( copy=False
, order='F'
).require
: L'entrée sera retourné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 un itérable (donc, par exemple, vous pouvez construire un tableau à partir des éléments d'un itérateur, au lieu d'un object
tableau avec l'itérateur); toujours copié.Il y a aussi des fonctions pratiques, comme asarray_chkfinite
(mêmes règles de copie que asarray
, mais soulève ValueError
s'il y en a nan
ou des inf
valeurs), et des constructeurs pour des sous-classes comme matrix
ou pour des cas spéciaux comme des tableaux d'enregistrement, et bien sûr le ndarray
constructeur réel (qui vous permet de créer directement un tableau de pas sur un tampon).
La définition de
asarray
est:Donc, c'est comme
array
, sauf qu'il a moins d'options, etcopy=False
.array
acopy=True
par défaut.La principale différence est que
array
(par défaut) fera une copie de l'objet, tandis queasarray
non sauf si nécessaire.la source
array([1, 2, 3])
ouasarray([1, 2, 3])
?[1, 2, 3]
est une liste Python, donc une copie des données doit être faite pour créer lendarary
. Utilisez doncnp.array
directement au lieu denp.asarray
qui enverrait lecopy=False
paramètrenp.array
. Lecopy=False
est ignoré si une copie doit être faite comme elle le serait dans ce cas. Si vous comparez les deux à l'aide%timeit
d'IPython, vous verrez une différence pour les petites listes, mais peu importe ce que vous utilisez pour les grandes listes.np.asanyarray
?asarray
renvoie toujours unndarray
.asanyarray
renverra une sous-classe dendarray
si c'est ce qui lui a été transmis. Par exemple, annp.matrix
est une sous-classe dendarray
.np.asanyarray(np.matrix(...))
Retourne donc la même matrice, tandis quenp.asarray(np.matrix(...))
convertit la matrice en anndarray
.La différence peut être démontrée par cet exemple:
générer une matrice
utiliser
numpy.array
pour modifierA
. Ne fonctionne pas car vous modifiez une copieutiliser
numpy.asarray
pour modifierA
. Cela a fonctionné parce que vous modifiezA
elle - mêmeJ'espère que cela t'aides!
la source
Les différences sont mentionnées assez clairement dans la documentation de
array
etasarray
. 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 des fonctions sont les suivantes:
et
Les arguments suivants sont ceux qui peuvent être transmis à
array
et ne sont pasasarray
mentionnés dans la documentation:la source
Voici un exemple simple qui peut démontrer la différence.
La principale différence est que le tableau 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.
Le contenu du tableau (a) reste intact et nous pouvons toujours effectuer n'importe quelle opération sur les données en utilisant un autre objet sans modifier le contenu du tableau d'origine.
la source
asarray(x)
est commearray(x, copy=False)
À utiliser
asarray(x)
lorsque vous souhaitez vous assurer qu'ilx
s'agira d'un tableau avant que toute autre opération ne soit effectuée. Six
est déjà un tableau, aucune copie ne sera effectuée. Cela n'entraînerait pas un impact redondant sur les performances.Voici un exemple de fonction qui assure d'abord la
x
conversion en tableau.la source