web-dev-qa-db-fra.com

Vue sur un tableau numpy?

J'ai un tableau 2D numpy. Existe-t-il un moyen d'y créer une vue qui inclurait les premières k lignes 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 possible.)

86
NPE

Bien sûr, indexez-le comme vous le feriez normalement. Par exemple. y = x[:k, :] Cela renverra une vue dans le tableau d'origine. Aucune donnée ne sera copiée et toutes les mises à jour apportées à y seront reflétées dans x et vice versa.


Éditer:

Je travaille généralement avec des matrices 3D> 10 Go d'uint8, donc je m'inquiète beaucoup à ce sujet ... Numpy peut être très efficace dans la gestion de la mémoire si vous gardez quelques choses à l'esprit. Voici quelques conseils pour éviter de faire des copies de tableaux en mémoire:

Utilisez +=, -=, *=, 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. (voir aussi numexpr )

Si vous souhaitez effectuer une copie avec x = x + 10, Sachez que x = x + 10.0 Entraînera automatiquement la conversion de x en tableau à virgule flottante, si ce n'était pas le cas. déjà. Cependant, x += 10.0, Où x est un tableau entier, entraînera la conversion de 10.0 À un entier de la même précision que le tableau.

De plus, de nombreuses fonctions numpy prennent un paramètre out, vous pouvez donc faire des choses comme np.abs(x, x) pour prendre la valeur absolue de x en place.


En deuxième édition, voici quelques conseils supplémentaires sur les vues vs les copies avec des tableaux numpy:

Contrairement à python listes, 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 ' ré utiliser) utiliser y = x.copy()

Vous entendrez souvent parler d '"indexation sophistiquée" des tableaux numpy. L'utilisation d'une liste (ou d'un tableau d'entiers) comme index équivaut à une "indexation sophistiquée". Il peut être très utile, mais copie les données.

À titre d'exemple: y = x[[0, 1, 2], :] Renvoie une copie, tandis que y = x[:3,:] Renvoie une vue.

Même une indexation vraiment folle comme x[4:100:5, :-10:-1, None] Est une indexation "normale" et retournera une vue, cependant, n'ayez pas peur d'utiliser toutes sortes de trucs de découpage sur de grands tableaux.

x.astype(<dtype>) renverra une copie des données comme nouveau type, tandis quex.view(<dtype>) renverra 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 en mémoire. Si vous avez un tableau de flottants et que vous les voyez comme des entiers, (ou vice versa) numpy interprétera les bits sous-jacents du tableau comme des entiers.

Par exemple, cela signifie que 1.0 En tant que flottant 64 bits sur un système little-endian sera 4607182418800017408 Lorsqu'il sera considéré comme un entier 64 bits et un tableau de [ 0, 0, 0, 0, 0, 0, 240, 63] S'il est considéré comme un uint8. C'est vraiment sympa quand vous avez besoin de faire du bit-tw quelque sorte sur de grands tableaux, cependant ... Vous avez un contrôle de bas niveau sur la façon dont le tampon mémoire est interprété.

214
Joe Kington