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