Matrice extraite en Python
Bonjour, je cherche à écrire une fonction qui prend en paramètres une matrice carrée A (sous forme d'un tableau numpy) et deux entiers i et j et renvoie la matrice extraire de A à laquelle on a enlevé la ligne i et la colonne j.
Disons que la matrice est de taille 10. Je sais enlever la ligne 0 et la colonne 0 en écrivant A[1:10, 1:10], je sais enlever la ligne 5 (pour prendre une ligne qui n'est pas au bord) et la colonne 0 en écrivant A[[k for k in range(10) if k != 5], 1:10].
Mais si je veux enlever la ligne 5 et la colonne 6, j'écrirais bien A[[k for k in range(10) if k != 5], [k for k in range(10) if k != 6]] et ça ne fait pas du tout ce que je veux.
Je saurais probablement faire cela en initialisant une matrice nulle puis en remplaçant au fur et à mesure, mais les slices sont en général tellement pratique que je trouve cela dommage de s'en passer.
Autre chose, j'écrivais du code formaté sur l'ancien forum, je ne trouve plus le bouton qui permet de faire cela ? (et qui aurait évité de vous écrire un truc illisible).
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
ce qui donne.
A=[[ 0 1 2 3 4 5 6 7 8 9]
[10 11 12 13 14 15 16 17 18 19]
[20 21 22 23 24 25 26 27 28 29]
[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]
[50 51 52 53 54 55 56 57 58 59]
[60 61 62 63 64 65 66 67 68 69]
[70 71 72 73 74 75 76 77 78 79]
[80 81 82 83 84 85 86 87 88 89]
[90 91 92 93 94 95 96 97 98 99]]
A=[[ 0 1 2 3 6 7 8 9]
[10 11 12 13 16 17 18 19]
[20 21 22 23 26 27 28 29]
[30 31 32 33 36 37 38 39]
[40 41 42 43 46 47 48 49]
[50 51 52 53 56 57 58 59]
[60 61 62 63 66 67 68 69]
[70 71 72 73 76 77 78 79]
[80 81 82 83 86 87 88 89]
[90 91 92 93 96 97 98 99]]
Un extrait d'un tuto numpy que j'ai commis il y a quelque temps déjà :
C'est pas du tout dans l'esprit Numpy, cette formulation avec deux boucles for.
Et puis, pourquoi écrire "[k for k in range(n)]" alors que "range(n)" fait l'affaire ?
Tout à fait d'accord avec jmf: l'idée est d'utiliser le slicing (comme tu le demandes à l'origine) et de ne faire aucune boucle, dont je ne vois d'ailleurs pas l'intérêt ici
essai1 est une liste, essai2 un générateur, essai3 un chaînage de générateurs.
La taille (mesurée par la fonction getsizeof() du module sys est respectivement 9024, 88, 56.
Les trois boucles suivantes donnent le même résultat :
-- Schnoebelen, Philippe
Pour ne pas avoir de blocs contigus, j'ai généré aléatoirement les indices de lignes à supprimer (il faut donc éviter les doublons). Au final :
- je supprime un peu plus de 6% des lignes sur 10 million
- temps < 0.2 seconde sur ma machine
et avec des boucles, ça donnerait quoi ?-- Schnoebelen, Philippe