Vue sur un tableau numpy?
j'ai un tableau 2D numpy
. Y a-t-il un moyen de créer une vue dessus qui inclurait les premières lignes k
et toutes les colonnes?
le but est d'éviter de copier les données sous-jacentes (le tableau est si grand que faire des copies partielles n'est pas faisable.)
1 réponses
bien sûr, indexez-le comme vous le feriez normalement. Par exemple: y = x[:k, :]
renvoie une vue dans le tableau original. Aucune donnée ne sera copiée, et toute mise à jour faite à y
sera reflétée dans x
et vice versa.
Edit:
je travaille souvent avec des tableaux 3D de plus de 10 Go de uint8, donc je m'inquiète beaucoup à ce sujet... Num PY peut être très efficace à la gestion de la mémoire si vous gardez quelques choses dans esprit. Voici quelques conseils pour éviter de faire des copies de tableaux en mémoire:
Utilisation +=
, -=
, *=
, etc pour éviter de faire une copie du tableau. Par exemple: x += 10
modifiera le tableau en place, tandis que x = x + 10
fera une copie et le modifiera. (aussi, jetez un oeil à numexpr )
Si vous voulez faire une copie avec x = x + 10
, sachez que x = x + 10.0
, x
automatiquement être coulé à virgule flottante de tableau, si ce n'était pas déjà. Cependant, x += 10.0
, où x
est un tableau entier, causera le 10.0
d'être rabaissé à un int de la même précision que le tableau, à la place.
en outre, de nombreuses fonctions num PY prennent un paramètre out
, de sorte que vous pouvez faire des choses comme np.abs(x, x)
pour prendre la valeur absolue de x
en place.
Comme un deuxième éditer, voici quelques conseils sur vues vs. copies avec des tableaux vides:
Contrairement aux listes python, y = x[:]
ne renvoie pas de copie, il renvoie une vue. Si vous voulez une copie (qui, bien sûr, doublera la quantité de mémoire que vous utilisez) utiliser y = x.copy()
vous entendrez souvent parler de" l'indexation fantaisiste " des tableaux numpy. Utiliser une liste (ou un tableau entier) comme un index est " fancy indexer." Il peut être très utile, mais copie les données.
comme exemple de ceci: y = x[[0, 1, 2], :]
renvoie une copie, tandis que y = x[:3,:]
renvoie une vue.
même indexation vraiment folle comme x[4:100:5, :-10:-1, None]
est "normal" indexation et retournera une vue, bien que, ne pas avoir peur d'utiliser toutes sortes de trucs de tranchage sur les grands tableaux.
x.astype(<dtype>)
retournera une copie des données comme le nouveau type, tandis que x.view(<dtype>)
sera de retour d'une vue.
soyez prudent avec cela, cependant... C'est extrêmement puissant et utile, mais vous devez comprendre comment les données sous-jacentes sont stockées dans la mémoire. Si vous avez un tableau de flotteurs, et les voir comme ints, (ou vice versa) numpy interprétera le bits sous-jacent du tableau comme ints.
par exemple, cela signifie que 1.0
comme un flotteur 64bit sur un système little-endian sera 4607182418800017408
lorsqu'il est considéré comme un int 64bit, et un tableau de [ 0, 0, 0, 0, 0, 0, 240, 63]
s'il est considéré comme un uint8. C'est vraiment agréable quand vous avez besoin de faire peu-twiddling d'une sorte sur les grands tableaux, cependant... Vous avez un contrôle de bas niveau sur la façon dont la mémoire tampon est interprétée.