Je veux modifier une matrice de transition carrée dense en place en changeant l'ordre de plusieurs de ses lignes et colonnes, en utilisant la bibliothèque numpy de python. Mathématiquement, cela correspond à la pré-multiplication de la matrice par la matrice de permutation P et à la post-multiplication par P ^ -1 = P ^ T, mais ce n'est pas une solution calculable.
En ce moment, j'échange manuellement des lignes et des colonnes, mais je m'attendais à ce que numpy ait une belle fonction f (M, v) où M a n lignes et colonnes, et v a n entrées, de sorte que f (M, v) se mette à jour M selon la permutation d'index v. Peut-être que je ne réussis pas à chercher sur Internet.
Quelque chose comme cela pourrait être possible avec "l'indexation avancée" de numpy mais je crois comprendre qu'une telle solution ne serait pas en place. De plus, pour certaines situations simples, il peut être suffisant de suivre séparément une permutation d'index, mais ce n'est pas pratique dans mon cas.
Ajouté:
Parfois, lorsque les gens parlent de permutations, ils ne signifient que l'échantillonnage de permutations aléatoires, par exemple dans le cadre d'une procédure pour obtenir des valeurs de p dans les statistiques. Ou ils signifient compter ou énumérer toutes les permutations possibles. Je ne parle pas de ces choses.
Ajouté:
La matrice est assez petite pour tenir dans la RAM du bureau mais assez grande pour que je ne veuille pas la copier sans réfléchir. En fait, je voudrais utiliser des matrices aussi grandes que possible, mais je ne veux pas gérer l'inconvénient de ne pas pouvoir les conserver dans la RAM, et je fais des opérations O (N ^ 3) LAPACK sur la matrice qui serait également limiter la taille de la matrice pratique. Je copie actuellement des matrices de cette taille inutilement, mais j'espère que cela pourrait être facilement évité pour la permutation.
la source
M[v]
à permuter les lignes.Réponses:
Selon les documents, il n'y a pas de méthode de permutation sur place dans numpy, quelque chose comme ndarray.sort .
Donc, vos options sont (en supposant queN×N
M
c'est une matrice et le vecteur de permutation)p
J'espère que ces hacks sous-optimaux sont utiles.
la source
Avertissement: L'exemple ci-dessous fonctionne correctement, mais l' utilisation de l'ensemble complet des paramètres suggérés à la fin du post expose un bogue , ou au moins une "fonctionnalité non documentée" dans la fonction numpy.take (). Voir les commentaires ci-dessous pour plus de détails. Rapport de bogue déposé .
Vous pouvez le faire sur place avec la fonction take () de numpy , mais cela nécessite un peu de saut de cerceau.
Voici un exemple de réalisation d'une permutation aléatoire des lignes d'une matrice d'identité:
Pour le faire sur place, tout ce que vous devez faire est de spécifier que le paramètre "out" doit être le même que le tableau d'entrée ET vous devez définir le mode = "clip" ou mode = "wrap". Si vous ne définissez pas le mode, il fera une copie pour restaurer l'état du tableau sur une exception Python (voir ici) .
Sur une note finale, take semble être une méthode de tableau, donc au lieu de
tu pourrais appeler
si c'est plus à votre goût. Donc, au total, vous appelez devrait ressembler à ceci:
Pour permuter les lignes et les colonnes, je pense que vous devez soit l'exécuter deux fois, soit tirer de vilains manigances avec numpy.unravel_index qui me font penser à la tête.
la source
1.6.2
,test take, not overwriting: True
,test not-in-place take: True
,test in-place take: False
,rr [3, 7, 8, 1, 4, 5, 9, 0, 2, 6]
,arr [30 70 80 70 40 50 90 30 80 90]
,ref [30 70 80 10 40 50 90 0 20 60]
. Doncnp.take
au moins pour numpy 1.6.2 n'est pas conscient de faire une permutation sur place et gâche les choses.Si vous avez une matrice clairsemée stockée au
COO
format, les éléments suivants peuvent être utilesen supposant quem m
A
contient laCOO
matrice, etperm
est unnumpy.array
contenant la permutation. Il n'y aura que surcharge mémoire, où est le nombre d'éléments non nuls de la matrice.mla source
C00
matrice clairsemée en premier lieu?int
s et 1float
dans une représentation clairsemée par élément par rapport à un seulfloat
dans la représentation dense). Mais la surcharge de mémoire de cette méthode seranumpy.ndarray
s réguliers .Je n'ai pas assez de réputation pour commenter, mais je pense que la question SO suivante pourrait être utile: /programming/4370745/view-onto-a-numpy-array
Les points de base sont que vous pouvez utiliser le découpage de base et créerez une vue sur le tableau sans copier, mais si vous le faites tranchage / indexation avancée , alors il va créer une copie.
la source
Qu'en est-il de
my_array [:, [0, 1]] = my_array [:, [1, 0]]
la source