web-dev-qa-db-fra.com

Numpy - tableau vs asarray

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.

244
Benjamin Hodgson

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).

57
abarnert

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.

211
unutbu

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. 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.]])
    
  3. 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!

102
Bobbie Wu

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.

12
asheeshr

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.

0
vivek