web-dev-qa-db-fra.com

Transposer une matrice en Python

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?

27
Asher Garland

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]]
100
Ashwini Chaudhary

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()
23

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) ]
11
Asher Garland