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

298

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.

Benjamin Hodgson
la source

Réponses:

110

Étant donné que d'autres questions sont redirigées vers celle-ci, qui posent des questions sur asanyarrayou 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.

arrayoffre 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 aest un ndarray, et mest un matrix, et ils ont tous les deux un dtypede 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 mmais pas a, car ce mn'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 mc'est un matrix, qui est une sous-classe de ndarray.
  • np.array(a, dtype=int, copy=False, subok=True)copiera les deux, car le dtypen'est pas compatible.

La plupart des autres fonctions sont des enveloppes minces autour de arrayce 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 ndarrayou sous-classe comme matrix( copy=False, subok=True).
  • ascontiguousarray: L'entrée sera retournée non copiée si elle est compatible ndarraydans l'ordre C contigu ( copy=False, order='C').
  • asfortranarray: L'entrée sera retournée non copiée si elle est compatible ndarraydans 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 objecttableau 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 ValueErrors'il y en a nanou des infvaleurs), et des constructeurs pour des sous-classes comme matrixou pour des cas spéciaux comme des tableaux d'enregistrement, et bien sûr le ndarrayconstructeur réel (qui vous permet de créer directement un tableau de pas sur un tampon).

abarnert
la source
Merci pour cela, c'est très utile
Kris
234

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. arraya copy=Truepar défaut.

La principale différence est que array(par défaut) fera une copie de l'objet, tandis que asarraynon sauf si nécessaire.

unutbu
la source
13
Alors, quand devrions-nous utiliser chacun? Si vous créez un tableau à partir de zéro, quel est le meilleur, array([1, 2, 3])ou asarray([1, 2, 3])?
endolith
15
@endolith: [1, 2, 3]est une liste Python, donc une copie des données doit être faite pour créer le ndarary. Utilisez donc np.arraydirectement au lieu de np.asarrayqui enverrait le copy=Falseparamètre np.array. Le copy=Falseest ignoré si une copie doit être faite comme elle le serait dans ce cas. Si vous comparez les deux à l'aide %timeitd'IPython, vous verrez une différence pour les petites listes, mais peu importe ce que vous utilisez pour les grandes listes.
unutbu
3
Cela a également du sens pour les noms de méthode: "asarray": Traitez cela comme un tableau (sur place), c'est-à-dire que vous changez simplement votre vue sur cette liste / tableau. "tableau": convertit réellement ceci en un nouveau tableau.
denvar
1
que diriez-vous np.asanyarray?
Lee
3
@Lee: asarrayrenvoie toujours un ndarray. asanyarrayrenverra une sous-classe de ndarraysi c'est ce qui lui a été transmis. Par exemple, an np.matrixest 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.
unutbu
114

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.arraypour 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.asarraypour modifier A. Cela a fonctionné parce que vous modifiez Aelle - 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!

Bobbie Wu
la source
13

Les différences sont mentionnées assez clairement dans la documentation de arrayet 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 à arrayet 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.

asheeshr
la source
1

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.

vivek
la source
0

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

À utiliser asarray(x)lorsque vous souhaitez vous assurer qu'il xs'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 xconversion en tableau.

def mysum(x):
    return np.asarray(x).sum()
off99555
la source