J'essaie de créer une fonction de transposition de matrice en Python. Une matrice est un tableau à deux dimensions, représenté par une liste de listes d'entiers. Par exemple, voici une matrice 2X3 (ce qui signifie que la matrice a une hauteur de 2 et une largeur de 3):
A=[[1, 2, 3],
[4, 5, 6]]
Pour être transposé, le jième élément de l’index doit devenir l’item de l’index. Voici à quoi ressemblerait l'exemple ci-dessus transposé:
>>> transpose([[1, 2, 3],
[4, 5, 6]])
[[1, 4],
[2, 5],
[3, 6]]
>>> transpose([[1, 2],
[3, 4]])
[[1, 3],
[2, 4]]
Comment puis-je faire ceci?
Vous pouvez utiliser Zip
avec *
pour transposer une matrice:
>>> A = [[ 1, 2, 3],[ 4, 5, 6]]
>>> Zip(*A)
[(1, 4), (2, 5), (3, 6)]
>>> lis = [[1,2,3],
... [4,5,6],
... [7,8,9]]
>>> Zip(*lis)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Si vous souhaitez que la liste renvoyée soit une liste de listes:
>>> [list(x) for x in Zip(*lis)]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
#or
>>> map(list, Zip(*lis))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Existe-t-il un prix pour la paresse et l'utilisation de la fonction de transposition des tableaux NumPy? ;)
import numpy as np
a = np.array([(1,2,3), (4,5,6)])
b = a.transpose()
Si nous voulions renvoyer la même matrice, nous écririons:
return [[ m[row][col] for col in range(0,width) ] for row in range(0,height) ]
Cela revient à itérer sur une matrice m en parcourant chaque ligne et en renvoyant chaque élément de chaque colonne. Donc, l'ordre serait comme:
[[1,2,3],
[4,5,6],
[7,8,9]]
Maintenant pour la question 3, nous voulons plutôt aller colonne par colonne, en retournant chaque élément de chaque ligne. Donc, l'ordre serait comme:
[[1,4,7],
[2,5,8],
[3,6,9]]
Par conséquent, changez simplement l'ordre dans lequel nous itérons:
return [[ m[row][col] for row in range(0,height) ] for col in range(0,width) ]