Quelle est la différence entre ndarray et array dans numpy?


Réponses:


221

numpy.arrayest juste une fonction pratique pour créer un ndarray; ce n'est pas une classe en soi.

Vous pouvez également créer un tableau à l'aide de numpy.ndarray, mais ce n'est pas la méthode recommandée. De la docstring de numpy.ndarray:

Les tableaux doivent être construits en utilisant array, zerosou empty... Les paramètres donnés ici se réfèrent à une méthode de bas niveau ( ndarray(...)) pour instancier un tableau.

La majeure partie de la viande de l'implémentation est en code C, ici en multiarray , mais vous pouvez commencer à regarder les interfaces ndarray ici:

https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py


1
Je pense que array () est implémenté dans core / src / multiarray / methods.c dans array_getarray ().
flxb

6
Cela peut vous mordre si vous oubliez que ce np.arrayn'est pas un cours, comme je le fais souvent. x = np.array([1,2.1,3]) if isinstance(x,np.array): # will give you a TypeError
Steve L

4
Vous n'avez toujours aucune idée pourquoi devrait éviter d'utiliser ndarray? Parce que c'est bas niveau?
GabrielChu

@flxb: Non, array_getarrayc'est l'implémentation de numpy.ndarray.__array__. numpy.arraycommence à _array_fromobject, au moins dans la mise en œuvre actuelle.
user2357112 prend en charge Monica

2
Alors pourquoi n'est-il pas recommandé?
NoName


31

Juste quelques lignes d'exemple de code pour montrer la différence entre numpy.array et numpy.ndarray

Étape d'échauffement: construire une liste

a = [1,2,3]

Vérifiez le type

print(type(a))

Tu auras

<class 'list'>

Construire un tableau (à partir d'une liste) en utilisant np.array

a = np.array(a)

Ou, vous pouvez sauter l'étape d'échauffement, avoir directement

a = np.array([1,2,3])

Vérifiez le type

print(type(a))

Tu auras

<class 'numpy.ndarray'>

qui vous indique que le type du tableau numpy est numpy.ndarray

Vous pouvez également vérifier le type en

isinstance(a, (np.ndarray))

et vous obtiendrez

True

L'une des deux lignes suivantes vous donnera un message d'erreur

np.ndarray(a)                # should be np.array(a)
isinstance(a, (np.array))    # should be isinstance(a, (np.ndarray))

4

numpy.ndarray()est une classe, tandis que numpy.array()est une méthode / fonction à créer ndarray.

Dans numpy docs, si vous voulez créer un tableau à partir d'une ndarrayclasse, vous pouvez le faire de 2 façons, comme indiqué:

1- à l'aide de array(), zeros()ou empty()méthodes: les tableaux doivent être construits à l'aide de tableaux, de zéros ou vides (voir la section Voir aussi ci-dessous). Les paramètres donnés ici font référence à une méthode de bas niveau ( ndarray(…)) pour instancier un tableau.

2- à partir de la ndarrayclasse directement: Il existe deux modes de création d'un tableau à l'aide de __new__: Si le tampon est None, seuls la forme, le dtype et l'ordre sont utilisés. Si buffer est un objet exposant l'interface de buffer, alors tous les mots clés sont interprétés.

L'exemple ci-dessous donne un tableau aléatoire car nous n'avons pas attribué de valeur tampon:

np.ndarray(shape=(2,2), dtype=float, order='F', buffer=None)

array([[ -1.13698227e+002,   4.25087011e-303],
       [  2.88528414e-306,   3.27025015e-309]])         #random

un autre exemple consiste à affecter un objet tableau à l'exemple de tampon:

>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])

à partir de l'exemple ci-dessus, nous remarquons que nous ne pouvons pas attribuer une liste à "tampon" et nous avons dû utiliser numpy.array () pour renvoyer l'objet ndarray pour le tampon

Conclusion: utilisez numpy.array()si vous voulez faire un numpy.ndarray()objet "


0

Je pense qu'avec np.array()vous, vous ne pouvez créer du C que si vous mentionnez la commande, lorsque vous vérifiez son utilisation, dites np.isfortran()false. mais avec np.ndarrray()lorsque vous spécifiez l'ordre qu'il crée en fonction de l'ordre fourni.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.