Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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. smile


"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 ?
smile

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. wink

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 ? wink

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