Question

J'ai un tableau de numpy 2D. Est-il possible de créer une vue sur ce qui inclurait les premières lignes de k et toutes les colonnes?

Le point est d'éviter la copie des données sous-jacentes (le tableau est si grand que de faire des copies partielles est impossible.)

Était-ce utile?

La solution

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


Edit:

Je souvent le travail avec> 10GB tableaux 3D de uint8 de, donc je me inquiète à ce sujet beaucoup ... Numpy peut être très efficace à la gestion de la mémoire si vous gardez quelques petites 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 de le modifier. (Également, consultez la page numexpr )

Si vous souhaitez effectuer une copie avec x = x + 10, sachez que x = x + 10.0 causera x d'être automatiquement-casté à un tableau à virgule flottante, si ce n'était pas déjà. Cependant, x += 10.0, où x est un tableau entier, provoquera la 10.0 être vers le bas-casté en un int de la même précision que le tableau, à la place.

En outre, de nombreuses fonctions numpy prendre un paramètre out, de sorte que vous pouvez faire des choses comme np.abs(x, x) de prendre la valeur absolue de x en place.


En tant que deuxième édition, voici quelques conseils sur la vues vs copies avec des tableaux numpy:

Contrairement aux listes de python, y = x[:] ne retourne pas une copie, il retourne une vue. Si vous ne voulez une copie (qui, bien sûr, doubler la quantité de mémoire que vous utilisez) l'utilisation y = x.copy()

Vous entendrez souvent « l'indexation de fantaisie » de tableaux numpy. En utilisant une liste (ou un tableau entier) comme un indice est « indexation de fantaisie ». Il peut être très utile, mais copie les données.

A titre d'exemple: y = x[[0, 1, 2], :] retourne une copie, alors que y = x[:3,:] renverrait une vue.

Même indexation vraiment fou comme x[4:100:5, :-10:-1, None] est l'indexation « normal » et renvoie une vue, cependant, il ne faut pas avoir peur d'utiliser toutes sortes de trucs à trancher sur de grands tableaux.

x.astype(<dtype>) renverra une copie des données que le nouveau type, whilex.view(<dtype>) retournera une vue.

Soyez prudent avec cela, mais ... Il 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 chars, et les considérer comme ints, (ou vice versa) numpy interpréteront sous-jacent Mèches du tableau comme ints.

Par exemple, cela signifie que 1.0 comme un flotteur de 64 bits sur un système peu endian sera 4607182418800017408 quand considéré comme un 64bit int, et un tableau de [ 0, 0, 0, 0, 0, 0, 240, 63] si considéré comme un uint8. C'est vraiment agréable quand vous avez besoin de faire peu-bidouilles de quelque sorte sur de grands tableaux, mais ... Vous avez le contrôle de bas niveau sur la façon dont est interprété le tampon de mémoire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top