Obtenez tous les diagonales dans une matrice/liste de listes en Python
Je suis à la recherche d'un Pythonic façon d'obtenir toutes les diagonales d'un carré) de la matrice, représenté par une liste de listes.
Supposons que j'ai la matrice suivante:
matrix = [[-2, 5, 3, 2],
[ 9, -6, 5, 1],
[ 3, 2, 7, 3],
[-1, 8, -4, 8]]
Puis les grandes diagonales sont faciles:
l = len(matrix[0])
print [matrix[i][i] for i in range(l)] # [-2, -6, 7, 8]
print [matrix[l-1-i][i] for i in range(l-1,-1,-1)] # [ 2, 5, 2, -1]
Mais j'ai du mal à venir avec un moyen de générer toutes les diagonales. La sortie je suis à la recherche d'est:
[[-2], [9, 5], [3,-6, 3], [-1, 2, 5, 2], [8, 7, 1], [-4, 3], [8],
[2], [3,1], [5, 5, 3], [-2, -6, 7, 8], [9, 2, -4], [3, 8], [-1]]
Vous devez vous connecter pour publier un commentaire.
Il y a probablement de meilleures façons de faire dans numpy que ci-dessous, mais je ne suis pas trop familier avec elle encore:
De sortie
Modifier: mise à Jour de généraliser pour toute la taille de la matrice.
De sortie
Commencer avec les diagonales que pente vers le haut-et-droit.
Si (x,y) est l'une de coordonnées rectangulaires à l'intérieur de la matrice, vous voulez transformer à partir d'un système de coordonnées (p,q), où p est le nombre de la diagonale et q est l'indice le long de la diagonale. (Si p=0, c'est la [-2] en diagonale, p=1, c'est la [9,5] en diagonale, p=2 est l' [3,-6,3] en diagonale, et ainsi de suite.)
De transformer une (p,q) dans un (x,y), vous pouvez utiliser:
Essayer de brancher les valeurs de p et q pour voir comment cela fonctionne.
Maintenant, vous venez de boucle... Pour p de 0 à 2N-1, et q à partir de max(0, p-N+1) min(p, N-1). Transformer p,q, x,y et imprimer.
Puis pour les autres diagonales, répétez les boucles, mais utiliser un autre transformation:
(Cela permet juste à l'inverse la matrice de gauche à droite.)
Désolé je n'ai pas fait ce code en Python. 🙂
C'est pour
Moe
, qui a demandé à une question similaire.Je commence par faire simple les fonctions de copier des lignes ou des colonnes de toute matrice rectangulaire.
Avec ces deux fonctions, je puis obtenir les diagonales par l'ajout d'une augmentation/diminution de la mémoire tampon pour le début/la fin de chaque ligne. Je puis obtenir les colonnes de ce tampon de la grille, puis retirez le tampon sur chaque colonne par la suite. ie)
.
Je suis tombé sur une autre solution intéressante à ce problème.
La ligne, la colonne, vers l'avant et vers l'arrière en diagonale peut tous être immédiatement découvert en regardant une combinaison de x et de y.
À partir du diagramme, vous pouvez voir que chaque diagonale et de l'axe est uniquement identifiables à l'aide de ces équations. Prendre chaque numéro unique de chaque table et créer un conteneur pour identifiant.
Noter que l'arrière diagonales ont été compensés pour commencer à un index de zéro, et que la longueur de l'avant diagonales est toujours égale à la longueur de l'arrière diagonales.
Qui permet d'imprimer
J'ai fini de réinventer la roue récemment. Voici une facile à réutiliser/étendre la méthode pour trouver les diagonales d'un carré liste de listes:
En supposant que la liste d'indices:
alors la configuration de la
bltr = True
(par défaut), renvoie les diagonales d'en bas à gauche à en haut à droite, c'est à direréglage
bltr = False
, renvoie les diagonales d'en bas à gauche à en haut à droite, c'est à direVoici une version exécutable à l'aide de l'OP de la matrice d'entrée.
Cela ne fonctionne que pour matricies de la même largeur et la hauteur.
Mais il ne repose pas sur des tiers.
Du Code sur la base de la Nemo réponse ci-dessus: