#1 Le 24/03/2010, à 17:49
- kikislater
[Python] Créer une matrice ou un tableau
Bonjour,
Je souhaiterais créer une matrice ou un tableau en python pour pouvoir faire des opérations sur ces derniers : addition, multiplication ... sur des lignes et des colonnes.
Avec des listes de listes je ne sais pas si c'est réalisable ?
vous en pensez quoi?
Merci
Hors ligne
#2 Le 24/03/2010, à 18:12
- brulouni
Re : [Python] Créer une matrice ou un tableau
Je pense qu'il faut que tu cherches un peu sur le web et dans les dépôts ! et effectivement les listes de listes c'est pas une bonne idée.
Jette un œil du côté de numpy qui devrait te satisfaire.
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#3 Le 24/03/2010, à 18:19
- BadZoot
Re : [Python] Créer une matrice ou un tableau
Bonjour,
Dans des listes, tu peux mettre ce que tu veux comme données, y compris des listes, qui peuvent contenir d'autres listes, etc...
Selon moi, une liste de listes est plutôt bien indiqué. Pour cela, jette un œil aux lists comprehensions, c'est très pratique (sur le site du zéro, par ex).
Il existe, de mémoire, un module numpy, qui permet de faire une array, j'ai dû m'en servir en tout et pour tout, une seule fois.
Bonnes recherches.
Le pervers père de Pierre perd son imper' vert.
No, I am Zoot's identical twin-sister : Dingo.
Hors ligne
#4 Le 24/03/2010, à 18:20
- Jean-Julien
Re : [Python] Créer une matrice ou un tableau
Pourquoi une liste de listes ?
Une seule liste suffit. Il suffit de la gérer correctement en fonction de la largeur et de la hauteur de ton tableau. Pourquoi faire compliqué quand on peut faire simple ?
Hors ligne
#5 Le 24/03/2010, à 18:28
- brulouni
Re : [Python] Créer une matrice ou un tableau
$ ipython --nobanner
In [1]: import numpy as np
In [2]: foo = [ [1, 2, 3],
...: [4, 5, 6],
...: [7, 8, 9] ]
In [3]: M = np.matrix(foo)
In [4]: M
Out[4]:
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [5]: M[:,2]
Out[5]:
matrix([[3],
[6],
[9]])
In [6]: M.T
Out[6]:
matrix([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
Après si tu veux ré-implémenter des opérations sur les matrices c'est tout à fait possible.
Tout dépend de tes objectifs.
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#6 Le 25/03/2010, à 08:32
- kikislater
Re : [Python] Créer une matrice ou un tableau
Merci de vos réponses, je vais regarder ça de plus près !
@bruloni, Comment je fais pour faire une somme de toute la première ligne ou toute la première colonne.
Désolé je suis débutant en python, j'ai juste suivit les cours sur full circle magazine
Merci
EDIT : Désolé, je suis un boulet, je viens de trouver. Merci encore
Dernière modification par kikislater (Le 25/03/2010, à 14:50)
Hors ligne
#7 Le 25/03/2010, à 16:24
- brulouni
Re : [Python] Créer une matrice ou un tableau
$ ipython --nobanner
In [1]: import numpy as np
In [2]: foo = [ [1, 2, 3],
...: [4, 5, 6],
...: [7, 8, 9] ]
In [4]: M = np.matrix(foo)
In [5]: M[0, :] # première ligne
Out[5]: matrix([[1, 2, 3]])
In [6]: M[:, 0] # première colonne
Out[6]:
matrix([[1],
[4],
[7]])
In [7]: np.sum(M[0, :])
Out[7]: 6
In [8]: np.sum(M[:, 0])
Out[8]: 12
Sinon jette un oeil sur ce site : http://numpy.scipy.org/
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#8 Le 25/03/2010, à 16:53
- kikislater
Re : [Python] Créer une matrice ou un tableau
Merci !
Je vais essayer d'importer un csv dans python avec ça :
import csv
reader=csv.reader(open("fichier.csv", 'rw'))
X=[]Y=[]
for row in reader:
X.append(float(row[0]))
Y.append(float(row[1]))
pass
C'est sert à quoi ipython ? C'est une sorte de frontend ?
Hors ligne
#9 Le 25/03/2010, à 19:24
- brulouni
Re : [Python] Créer une matrice ou un tableau
ipython c'est un interpréteur interactif amélioré.
Pour les fichiers tu as plein de façon de faire :
** avec csv :
import numpy, csv
reader = csv.reader(open('spam.csv'), delimiter = ' ')
M = []
[M.append(row) for row in reader]
numpy.matrix(M)
** avec numpy
import numpy
M = numpy.genfromtxt('spam.csv')
A toi de choisir !
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#10 Le 26/03/2010, à 16:28
- kikislater
Re : [Python] Créer une matrice ou un tableau
Re-merci pour tes réponses,
Comment se fait-il que lorsque je fais ça :
for i in M:
ms = M[0][0] * M[0][7]
print ms
ça ne fonctionne pas?
En fait, au final, je voudrais qu'il me calcule la multiplication de chaque colonne par la colonne 8 et en fasse ensuite la somme
je sais le faire en R mais là je ne vois pas du tout. Voici en R :
for (i in 1:nrow(M))
{
M$ms <- M[,7] * M[,1]
}
Merci d'avance si jamais une personne peut le faire
Dernière modification par kikislater (Le 26/03/2010, à 16:31)
Hors ligne
#11 Le 26/03/2010, à 16:35
- Kanor
Re : [Python] Créer une matrice ou un tableau
C'est normal que ton code ne fonctionne pas le print est mal indenté
tu dois avoir
for in in M:
ms = M[0][0] * M[0]M[7]
print ms
et bizarre ton code en passant
Et pour ta demande
results = []
for ligne in M:
result_col =[]
val_col8 = ligne[7]
for col in ligne[0:7]:
result_col.append(col*val_col8)
results.append(sum(result_col))
import pprint
pprint.pprint(results)
si par exemple M = [[1,2,3,4,3,5,3,7],
[2,3,4,2,5,2,5,2]]
ça donne [147, 46]
Dernière modification par Kanor (Le 26/03/2010, à 16:40)
Hors ligne
#12 Le 26/03/2010, à 16:44
- brulouni
Re : [Python] Créer une matrice ou un tableau
for (i in 1:nrow(M))
{
Microsoftms <- M[,7] * M[,1]
}
for in in M:
ms = M[0][0] * M[0]M[7]
print ms
Je ne vois pas trop le but de la boucle que ce soit en Python ou en R
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#13 Le 26/03/2010, à 17:12
- brulouni
Re : [Python] Créer une matrice ou un tableau
Mais vous allez utiliser numpy bordel de m#rde !
import numpy as np
foo = [ [1,2,3,4,3,5,3,7],
[2,3,4,2,5,2,5,2] ]
bar = np.array(foo)
np.sum(bar[:, 0:7], 1) * bar[:, 7] # Solution concise
np.sum(np.array([ bar[:, i] * bar[:, 7] for i in range(7) ]), 0) # Solution obscure
Si tu connais R, tu devrais préférer utiliser numpy que des listes de listes !!!
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#14 Le 26/03/2010, à 17:34
- Kanor
Re : [Python] Créer une matrice ou un tableau
Bon python seul va plus vite mais numpy doit aller plus vite quand M devient plus grand
import time
import numpy as np
M = [[1,2,3,4,3,5,3,7],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
]
t0 = time.time()
for item in range(0, 10000):
results = []
for ligne in M:
result_col =[]
val_col8 = ligne[7]
for col in ligne[0:7]:
result_col.append(col*val_col8)
results.append(sum(result_col))
print "Solution pure python"
print time.time() - t0
tx = time.time()
for item in range(0, 10000):
results = [sum([col* ligne[7] for col in ligne[0:7]]) for ligne in M]
print "Solution exotique python"
print time.time() - tx
t1 = time.time()
for item in range(0,10000):
results = []
bar = np.array(M)
results = np.sum(bar[:, 0:7], 1) * bar[:, 7] # Solution concise
print "Solution numpy"
print time.time() - t1
0.753008842468
Solution exotique python
0.600703001022
Solution numpy
1.14271092415
Pour numpy le truc qui prend du temps c'est le bar = np.array(M)
ça doit étre rentable si mon M est plus grand
edit Et bah non
Solution pure python
44.9349751472
Solution exotique python
36.5697999001
Solution numpy
51.768321991
avec un M contenant 1064 ligne
Dernière modification par Kanor (Le 26/03/2010, à 17:42)
Hors ligne
#15 Le 26/03/2010, à 18:02
- brulouni
Re : [Python] Créer une matrice ou un tableau
Étonnant ton benchmark !
In [1]: import time
In [2]: import numpy as np
In [3]:
In [4]: M = [[1,2,3,4,3,5,3,7],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: [2,3,4,2,5,2,5,2],
...: ]
In [5]: A = np.array(M)
In [6]: def pur_python(M):
...: for item in range(0, 10000):
...: results = []
...: for ligne in M:
...: result_col =[]
...: val_col8 = ligne[7]
...: for col in ligne[0:7]:
...: result_col.append(col*val_col8)
...: results.append(sum(result_col))
...: return results
...:
In [7]: def numpy(M):
...: return np.sum(M[:, 0:7], 1) * M[:, 7]
In [20]: type(M)
Out[20]: <type 'list'>
In [21]: type(A)
Out[21]: <type 'numpy.ndarray'>
In [33]: %timeit -n 100 numpy(A)
100 loops, best of 3: 18.2 us per loop
In [34]: %timeit -n 100 pur_python(M)
100 loops, best of 3: 323 ms per loop
Numpy est *clairement* plus rapide : 18.2 micro secondes contre 323 ms !
Mais quoiqu'il en soit : quand je pousse à utiliser numpy c'est surtout pour la simplicité et la rapidité de codage... j'ai pas l'impression que notre ami est besoin de rapidité.
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#16 Le 26/03/2010, à 19:26
- Kanor
Re : [Python] Créer une matrice ou un tableau
oui mais dans ton test tu n'instancie pas np.array(M)
qui est devrait pris en compte dans ton test
Hors ligne
#17 Le 26/03/2010, à 19:48
- brulouni
Re : [Python] Créer une matrice ou un tableau
Il faut comparer ce qui est comparable :
d'un côté tu as une liste instanciée une fois et utilisé comme tel dans ton code pur python
et de l'autre côté tu fais une coercition de types à chaque itérations. Donc forcement c'est coûteux et pas équitable.
On peut aussi se poser la question de la légitimité de mettre une instanciation dans le code à profiler puisque qu'en général ce sont les traitements qui prennent du temps. Du coup j'avais bien pris soin d'éliminer l'instanciation de mes deux fonctions.
On peut comparer la création de matrices de taille équivalente :
In [88]: def foo():
M = [[1,2,3,4,3,5,3,7],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
]
In [107]: def bar():
np.zeros(17, 7)
In [116]: %timeit foo()
100000 loops, best of 3: 3.1 us per loop
In [117]: %timeit bar()
1000000 loops, best of 3: 826 ns per loop
La encore numpy est plus rapide
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#18 Le 29/03/2010, à 17:07
- brulouni
Re : [Python] Créer une matrice ou un tableau
Pour éviter de te donner de trop mauvais conseils :
Au message #9 je te proposais :
M = []
[M.append(row) for row in reader]
Que tu peux remplacer par :
M = [row for row in reader]
Au message #17 les fonctions foo et bar :
def foo():
M = [[1,2,3,4,3,5,3,7],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
[2,3,4,2,5,2,5,2],
]
def bar():
np.zeros(17, 7)
A remplacer par :
def foo():
M = [ [ 0 for i in range(7) ] for j in range(17) ]
def bar()
M = np.zeros((17, 7))
et on a :
%timeit foo()
100000 loops, best of 3: 15.9 us per loop
%timeit bar()
1000000 loops, best of 3: 804 ns per loop
Bon et à part ça tu en es où dans ton programme ?
Dernière modification par brulouni (Le 29/03/2010, à 17:24)
"Tout ce qui est simple est faux, tout ce qui est compliqué est inutile."
~ Paul Valery
Hors ligne
#19 Le 29/03/2010, à 17:51
- kikislater
Re : [Python] Créer une matrice ou un tableau
Merci !
Des fonctions ... j'en espérais pas tant ! Mon programme avance mais doucement.
Je m'y colle dans la semaine mais c'est du perso donc je prends mon temps
Hors ligne