2
votes

pourquoi le tableau numpy a une taille de 112 octets et quand je l'aplatis, il a 96 octets de mémoire?

J'ai un tableau numpy et je l'aplatis par np.ravel () et je suis confus quand j'ai essayé d'apprendre la taille des deux tableaux

array = np.arange (15) .reshape (3,5)

sys.getsizeof (tableau) 112

sys.getsizeof (array.ravel ()) 96

array.size 15

array.ravel (). taille 15

array = np.arange (30) .reshape (5,6)

sys.getsizeof (tableau) 112

sys.getsizeof (array.ravel ()) 96

array.size 30

Comme vu ci-dessus, deux tableaux différents ont la même taille de mémoire mais chacun a une quantité d'élément différente. Pourquoi cela arrive-t-il?


1 commentaires

Tous les tableaux que vous testez sont des vues et ne possèdent pas leur propre tampon de données


3 Réponses :


0
votes

sys.getsizeof ne renvoie pas la taille de la mémoire du tableau numpy, selon la documentation https://docs.python.org/2/library/sys.html#sys.getsizeof

pour trouver la taille de la mémoire d'un tableau numpy, utilisez nbytes ou calculez-le en multipliant la taille par itemize

array.nbytes

array.size * array.itemsize

comme l'a souligné Joachim Wagner, il y a une légère surcharge pour chaque tableau qui peut être un problème si vous avez beaucoup de tableaux np ... le sys.getsizeof (tableau) pourrait vous donner le taille de cette surcharge mais je ne suis pas sûr


3 commentaires

Il y a une surcharge de mémoire supplémentaire pour l'objet python et pour indiquer à numpy le type des éléments, par exemple int32 ou float64 .


l'extension tierce signifie-t-elle les bibliothèques (faites par la communauté) de python?


oui, tout ce qui ne sort pas de la boîte avec python est un non intégré



0
votes

Comme Derte l'a mentionné, sys.getsizeof ne dit pas la taille du tableau. Le 96 que vous avez contient des informations sur le tableau (s'il est unidimensionnel) et le 112 s'il est multidimensionnel. Tout élément supplémentaire augmentera la taille de 8 octets en supposant que vous utilisez un dtype = int64 .


0 commentaires

2
votes

(1) ravel () généralement (voir les commentaires de @ user2357112 ci-dessous) renvoie un objet qui référence les éléments de l'entrée plutôt que de faire une nouvelle copie:

>>> sys.getsizeof(np.arange(20))
256
>>> sys.getsizeof(np.arange(40))
416
>>> sys.getsizeof(np.arange(400))
3296


2 commentaires

ravel () généralement renvoie une vue. Dans les cas où les pas d'entrée rendent impossible la création d'une vue à plat, ravel () fera une copie. Ceci est souvent oublié.


Idem avec reshape .