web-dev-qa-db-fra.com

Comment faire des matrices en Python?

Je l'ai googlé et cherché dans StackOverflow et YouTube. Je n'arrive pas à obtenir des matrices en Python qui me cliquent dans la tête. Quelqu'un peut-il m'aider s'il vous plaît? J'essaie simplement de créer une boîte de base 5x5 qui affiche:

A A A A A
B B B B B
C C C C C
D D D D D
E E E E E

J'ai eu

a b c d e
a b c d e
a b c d e
a b c d e
a b c d e

Pour afficher, mais je ne pouvais même pas les amener à casser des lignes qui, au lieu de cela, ils apparaissent comme 

[['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E']]

Et si j'essaie d'y ajouter ou d'imprimer "" etc, cela ne fonctionne tout simplement pas ...\n s'affichera comme "A\n" et print s'affichera avant la matrice.

S'il vous plaît, aidez-moi, même si vous me dirigez vers un endroit qui devrait être vraiment évident et me faire passer pour un idiot, je veux juste apprendre ceci.

7
user2829468

La boucle aide:

for row in matrix:
    print ' '.join(row)

ou utilisez des appels imbriqués str.join():

print '\n'.join([' '.join(row) for row in matrix])

Démo:

>>> matrix = [['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E']]
>>> for row in matrix:
...     print ' '.join(row)
... 
A B C D E
A B C D E
A B C D E
A B C D E
A B C D E
>>> print '\n'.join([' '.join(row) for row in matrix])
A B C D E
A B C D E
A B C D E
A B C D E
A B C D E

Si vous souhaitez afficher les lignes et les colonnes transposées, transposez la matrice à l'aide de la fonction Zip() ; Si vous transmettez chaque ligne en tant qu'argument distinct de la fonction, Zip() recombine ces valeurs par valeur sous forme de tuples de colonnes. La syntaxe *args vous permet d'appliquer toute une séquence de lignes en tant qu'arguments séparés:

>>> for cols in Zip(*matrix):  # transposed
...     print ' '.join(cols)
... 
A A A A A
B B B B B
C C C C C
D D D D D
E E E E E
9
Martijn Pieters

La réponse à votre question dépend de vos objectifs d’apprentissage. Si vous essayez de faire en sorte que les matrices "cliquent" afin de pouvoir les utiliser plus tard, je suggérerais de regarder Numpy array au lieu d'une liste de listes. Cela vous permettra de découper facilement des rangées, des colonnes et des sous-ensembles. Essayez d’obtenir une colonne à partir d’une liste de listes et vous serez frustré. 

Utiliser une liste de listes comme matrice ...

Prenons votre liste de listes par exemple:

L = [list("ABCDE") for i in range(5)]

Il est facile d'obtenir des sous-éléments pour n'importe quelle ligne:

>>> L[1][0:3]
['A', 'B', 'C']

Ou toute une rangée:

>>> L[1][:]
['A', 'B', 'C', 'D', 'E']

Mais essayez de retourner cela pour obtenir les mêmes éléments en format de colonne, et cela ne fonctionnera pas ...

>>> L[0:3][1]
['A', 'B', 'C', 'D', 'E']

>>> L[:][1]
['A', 'B', 'C', 'D', 'E']

Vous devez utiliser quelque chose comme la compréhension de liste pour obtenir tous les éléments 1 ....

>>> [x[1] for x in L]
['B', 'B', 'B', 'B', 'B']

Entrer des matrices

Si vous utilisez plutôt un tableau, vous obtiendrez le découpage et l'indexation que vous attendez de MATLAB ou de R (ou de la plupart des autres langues, d'ailleurs):

>>> import numpy as np
>>> Y = np.array(list("ABCDE"*5)).reshape(5,5)
>>> print Y
[['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']]
>>> print Y.transpose()
[['A' 'A' 'A' 'A' 'A']
 ['B' 'B' 'B' 'B' 'B']
 ['C' 'C' 'C' 'C' 'C']
 ['D' 'D' 'D' 'D' 'D']
 ['E' 'E' 'E' 'E' 'E']]

Prenez la rangée 1 (comme avec les listes):

>>> Y[1,:]
array(['A', 'B', 'C', 'D', 'E'], 
      dtype='|S1')

Prenez la colonne 1 (nouveau!):

>>> Y[:,1]
array(['B', 'B', 'B', 'B', 'B'], 
      dtype='|S1')

Alors maintenant, pour générer votre matrice imprimée:

for mycol in Y.transpose():
    print " ".join(mycol)


A A A A A
B B B B B
C C C C C
D D D D D
E E E E E
10
beroe

vous pouvez aussi utiliser la fonction append 

b = [ ]

for x in range(0, 5):
    b.append(["O"] * 5)

def print_b(b):
    for row in b:
        print " ".join(row)
2
code

vous pouvez le faire court comme ceci:

matrix = [["A, B, C, D, E"]*5]
print(matrix)


[['A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E']]
0
svs

J'ai obtenu une solution simple à ce problème en transformant les listes en chaînes et en effectuant des opérations sur les chaînes pour obtenir une impression correcte de la matrice.

Créer la fonction

En créant une fonction, vous évitez d'avoir à écrire la boucle for chaque fois que vous souhaitez imprimer une matrice.

def print_matrix(matrix):
    for row in matrix:
        new_row = str(row)
        new_row = new_row.replace(',','')
        new_row = new_row.replace('[','')
        new_row = new_row.replace(']','')
        print(new_row)

Exemples

Exemple de matrice 5x5 avec 0 comme chaque entrée:

>>> test_matrix = [[0] * 5 for i in range(5)]
>>> print_matrix(test_matrix)
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0 

Exemple de matrice 2x3 avec 0 comme chaque entrée:

>>> test_matrix = [[0] * 3 for i in range(2)]
>>> print_matrix(test_matrix)
0 0 0
0 0 0

MODIFIER

Si vous voulez le faire imprimer:

A A A A A
B B B B B
C C C C C
D D D D D 
E E E E E

Je vous suggère simplement de changer la façon dont vous entrez vos données dans vos listes au sein de listes. Dans ma méthode, chaque liste de la plus grande liste représente une ligne dans la matrice, pas des colonnes.

0
J.Gaws