Réponses:
É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 deasarray
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, tandis que asarray
non sauf si nécessaire.
array([1, 2, 3])
ou asarray([1, 2, 3])
?
[1, 2, 3]
est une liste Python, donc une copie des données doit être faite pour créer le ndarary
. Utilisez donc np.array
directement au lieu de np.asarray
qui enverrait le copy=False
paramètre np.array
. Le copy=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 un ndarray
. asanyarray
renverra une sous-classe de ndarray
si c'est ce qui lui a été transmis. Par exemple, an np.matrix
est une sous-classe de ndarray
. np.asanyarray(np.matrix(...))
Retourne donc la même matrice, tandis que np.asarray(np.matrix(...))
convertit la matrice en an ndarray
.
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.]])
utiliser numpy.array
pour modifier A
. Ne fonctionne pas car vous modifiez une copie
>>> numpy.array(A)[2]=2
>>> A
matrix([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
utiliser numpy.asarray
pour modifier A
. Cela a fonctionné parce que vous modifiez A
elle - 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 mentionnées assez clairement 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 des fonctions sont les suivantes:
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 transmis à array
et ne sont pas asarray
mentionnés dans la documentation:
copy: bool, facultatif Si vrai (par défaut), alors l'objet est copié . Sinon, une copie ne sera effectuée que si elle
__array__
retourne une copie, si obj est une séquence imbriquée ou si une copie est nécessaire pour satisfaire à toutes les autres exigences (dtype, commande, etc.).subok: bool, facultatif Si True, les sous-classes seront transmises , sinon le tableau retourné sera forcé d'être un tableau de classe de base (par défaut).
ndmin: int, facultatif Spécifie le nombre minimum de dimensions que le tableau résultant doit avoir. Ceux-ci seront pré-suspendus à la forme selon les besoins pour répondre à cette exigence.
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.
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 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.
asarray(x)
est comme array(x, copy=False)
À utiliser asarray(x)
lorsque vous souhaitez vous assurer qu'il x
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.
def mysum(x):
return np.asarray(x).sum()