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

81
demandé sur NPE 2010-12-06 23:41:44

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.

204
répondu Joe Kington 2017-12-11 02:12:11