368 votes

Quelle est la différence entre les fonctions array() et asarray() de Numpy ?

Quelle est la différence entre les fonctions de Numpy array() y asarray() fonctions ? Quand faut-il utiliser l'une plutôt que l'autre ? Elles semblent générer des résultats identiques pour toutes les entrées auxquelles je peux penser.

267voto

unutbu Points 222216

Les définition de asarray est :

def asarray(a, dtype=None, order=None):
    return array(a, dtype, copy=False, order=order)

C'est donc comme si 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 ne le fera pas, à moins que cela ne soit nécessaire.

18 votes

Quand devons-nous utiliser chacun d'entre eux ? Si l'on crée un tableau à partir de zéro, quelle est la meilleure solution ? array([1, 2, 3]) o asarray([1, 2, 3]) ?

18 votes

@endolith : [1, 2, 3] est une liste Python, il faut donc faire une copie des données pour créer le fichier ndarary . Utilisez donc np.array directement au lieu de np.asarray qui enverrait le copy=False au paramètre np.array . Les copy=False est ignorée si une copie doit être faite, comme c'est le cas ici. Si vous comparez les deux en utilisant %timeit dans IPython, vous verrez une différence pour les petites listes, mais la différence n'a guère d'importance pour les grandes listes.

4 votes

C'est également logique si l'on se réfère aux noms des méthodes : "asarray" : Traite cela comme un tableau (inplace), c'est-à-dire que vous changez en quelque sorte de point de vue sur cette liste/ce tableau. "array" : Convertit réellement cette liste en un nouveau tableau.

195voto

abarnert Points 94246

Puisque d'autres questions sont redirigées vers celle-ci, qui portent sur asanyarray o autres routines de création de tableaux Il n'est donc pas inutile de résumer brièvement le rôle de chacun d'entre eux.

Les différences concernent principalement le moment où il faut renvoyer 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 drapeaux pour déterminer quand copier. Une explication complète prendrait autant de temps que la documentation (voir Création de tableaux Voici quelques exemples :

Supposons a est un ndarray y m es un matrix et ils ont tous les deux un dtype de float32 :

  • np.array(a) y np.array(m) copiera les deux, car c'est le comportement par défaut.
  • np.array(a, copy=False) y np.array(m, copy=False) copiera m mais pas a parce que m n'est pas un ndarray .
  • np.array(a, copy=False, subok=True) y np.array(m, copy=False, subok=True) ne copiera ni l'un ni l'autre, car m es 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 qui contrôlent le moment où la copie a lieu :

  • asarray : L'entrée sera renvoyée sans être copiée s'il s'agit d'un fichier compatible. ndarray ( copy=False ).
  • asanyarray : L'entrée sera renvoyée sans être copiée s'il s'agit d'un fichier compatible. ndarray ou une sous-classe comme matrix ( copy=False , subok=True ).
  • ascontiguousarray : L'entrée sera renvoyée sans être copiée s'il s'agit d'un fichier compatible. ndarray dans l'ordre C contigu ( copy=False , order='C') .
  • asfortranarray : L'entrée sera renvoyée sans être copiée s'il s'agit d'un fichier compatible. ndarray dans l'ordre contigu de Fortran ( copy=False , order='F' ).
  • require : L'entrée sera renvoyée sans être 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 (ainsi, par exemple, vous pouvez construire un tableau à partir des éléments d'un itérateur, au lieu d'un object avec l'itérateur) ; toujours copié.

Il existe également des fonctions de commodité, telles que asarray_chkfinite (mêmes règles de copie que asarray mais soulève ValueError s'il y en a nan o inf ), et des constructeurs pour des sous-classes telles que matrix ou pour des cas particuliers tels que les tableaux d'enregistrements, et bien sûr, le système de gestion de l'information. ndarray (qui vous permet de créer un tableau directement à partir de strides sur un tampon).

142voto

Bobbie Wu Points 1371

La différence peut être démontrée par cet exemple :

  1. générer une matrice

    >>> A = numpy.matrix(numpy.ones((3,3)))
    >>> A
    matrix([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
  2. 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.]])
  3. 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 vous aidera !

14voto

AsheeshR Points 2780

Les différences sont mentionnées très clairement dans la documentation de array y 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 passés à array y pas asarray comme indiqué dans la documentation :

copy : bool, optionnel Si true (valeur par défaut), l'objet est copié. . Dans le cas contraire, une copie ne sera effectuée que si __array__ r obj est une séquence imbriquée, ou si une copie est nécessaire pour satisfaire l'une des autres conditions (dtype, ordre, etc.).

subok : bool, optionnel Si Vrai, alors la sous-cla passées au travers sinon le tableau retourné sera forcé d'être un tableau tableau de classe de base (par défaut).

ndmin : int, optionnel Spécifie la valeur de la nombre minimum de dimensions que le tableau résultant devrait avoir. Celles-ci seront ajoutées au besoin à la forme si nécessaire pour répondre à cette exigence.

4voto

off99555 Points 844

asarray(x) est comme array(x, copy=False)

Utilice asarray(x) lorsque vous voulez vous assurer que x sera un tableau avant toute autre opération. Si le x est déjà un tableau, aucune copie ne sera effectuée. Cela n'entraînerait pas de baisse de performance redondante.

Voici un exemple de fonction qui assure x est d'abord converti en tableau.

def mysum(x):
    return np.asarray(x).sum()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X