Python, problème avec les tableaux

Python, problème avec les tableaux - Python - Programmation

Marsh Posté le 08-01-2009 à 21:57:35    

Bonsoir  :hello:  
 
Je suis en physique et malheureusement pour moi je dois faire un programme en python. Voilà mon problème: j'aimerai créer un tableau de 1000 colonnes, avec dans chacune de ces colonnes un tableau de 100 colonnes, ça donnerai [[x1_1,...,x1_100], .... , [x1000_1,...,x1000_100]].
 
tab1=N.array([])
#print tab1
for x in range(1,1000):  #pour x entre 0 et 10 m
 
 
 for i in range(1,100):
  E[i]=random.gauss(mean,ecart) #distribution gaussienne en energie
 
 for i in range(1,100):
   
  v_x[i]=c*sqrt(1-(mpion*c**2/E[i])**2)
  Ga_x[i]=1/sqrt(1-(v_x[i]/c)**2)
  GTAU_x[i]=Ga_x[i]*tau
  p_x[i]=1-M.exp(-x/(v_x[i]*GTAU_x[i]))
 
 tab1=N.append(tab1,p_x)
 
 print tab1[999]
 
print tab1
 
Dans ma boucle x, je créer une distribution gaussienne de 100 nombres.  Pour chaqun de ces nombres je calcule une probabilité p[i] (les v_x, ga_x sont des calculs intermédiaires) associé à la valeur x=1 pour commencer, jusqu'à x = 1000. J'ai donc 1000 tableaux de 100 colonnes.  Mais j'aimerai afficher seulement le 1000 em tableau par exemple. il faut donc que je mette mes 1000 tableaux dans un seul gros tableau, je créer donc un tableau vide tab1 avant la boucle et j'ajoute les 1000 tableaux au fur et à mesure: tab1=N.append(tab1,p_x). Mais ça ne marche pas, je dois faire une erreur mais je ne vois pas laquelle, si quelqu'un pouvait m'éclairer  :jap:  
 
Merci d'avance :)

Reply

Marsh Posté le 08-01-2009 à 21:57:35   

Reply

Marsh Posté le 09-01-2009 à 14:04:11    

1. Utilises le bloc [ code=python ] (en enlevant les espaces) quand tu postes du code, ça sera largement plus lisible.
2. Quand tu parles de tableaux, c'est ce sont des arrays NumPy? (donc numpy.array)?
3. "ça ne marche pas", c'est typiquement le genre de choses qui ne sert strictement à rien quand tu cherches de l'aide, parce que ça ne fournit aucune info. Qu'est-ce que se passe précisément, quel est le message ou l'erreur renvoyée par la console, ... sont des infos essentielles


Message édité par masklinn le 09-01-2009 à 14:10:33

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-01-2009 à 20:24:06    

ok, bon je vais faire plus simple car sinon c'est trop dur à expliquer. Comment faire pour avoir un grand tableau de 1000 colonnes 1 ligne avec dans chacune des colonnes un autre tableau de 100 colonnes 1 ligne ?

Reply

Marsh Posté le 11-01-2009 à 21:22:55    

Super Neutrino a écrit :

ok, bon je vais faire plus simple car sinon c'est trop dur à expliquer. Comment faire pour avoir un grand tableau de 1000 colonnes 1 ligne avec dans chacune des colonnes un autre tableau de 100 colonnes 1 ligne ?


Je voudrais que tu répondes à la question 2, selon que tu utilises numpy ou pas la situation n'est pas du tout la même.
 
La question 3 serait également pas mal, mais la 2 est essentielle.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-01-2009 à 21:47:12    

2. Pour tab1 oui j'utilise numpy (import numpy as N). Mes E et p sont définis au départ par des zeros(100, float).
3. quand j'essaye de récupérer le 999 élément de tab1 il m'affiche "index out of bound" donc le tableau ne va pas jusqu'à 999. Par contre quand je veux récupérer le 99 élément par exemple il m'affiche 1000 fois le même, j'ai l'impression qu'il crée 99900 tableaux de 100 éléments.


Message édité par Super Neutrino le 11-01-2009 à 21:48:50
Reply

Marsh Posté le 11-01-2009 à 21:58:14    

Pourquoi ne pas tout simplement définir ton tab1 (après lui avoir donné un meilleur nom) comme

Code :
  1. t = zeros((1000, 100))


?
Ca va créer un array de 1000 * 100 (enfin un array de 1000 contenant des arrays de 100 tous initialisés à 0, plus précisément) et t'as plus qu'à bricoler là dedans.


Message édité par masklinn le 11-01-2009 à 21:59:17

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-01-2009 à 23:06:36    

Merci c'est une bonne idée, j'ai travaillé là dessus mais je n'obtiens toujours pas le résultat voulu :sweat: j'aimerai bien poster mon code mais le bloc [code=python] n'a pas l'air de marcher.


Message édité par Super Neutrino le 11-01-2009 à 23:07:38
Reply

Marsh Posté le 11-01-2009 à 23:12:46    

Il marche très bien, c'est ce que j'ai utilisé pour mettre mon bout de code (faut penser à le fermer avec [/code])


Message édité par masklinn le 11-01-2009 à 23:12:50

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-01-2009 à 23:20:57    

ok, je le fermais avec [/code = python]  :jap:  
 

Code :
  1. t=zeros((1000, 100))
  2.  
  3. for x in range(1,1000):    
  4.     for i in range(1,100):
  5.         E[i]=random.gauss(mean,ecart) #distribution gaussienne en energie
  6.         
  7.         v[i]=c*sqrt(1-(mpion*c**2/E[i])**2)
  8.         Ga[i]=1/sqrt(1-(v[i]/c)**2)   #calculs intermediaires
  9.         GTAU[i]=Ga[i]*tau
  10.         
  11.         p=1-M.exp(-x/(v[i]*GTAU[i]))
  12.     t2=N.append(p,t2)
  13.         
  14.     print t2


 
J'aimerai avoir quelque chose comme [ [p(x=1, v1), ... , p(x=1, v100)], ... [p(x=1000, v1), ... , p(x=1000, v100)] ]. Mais quand je lance le programme il m'affiche pleins de tableaux (de plus de 100 colonnes) à la suite, ça n'a rien à voir avec mon tableau t.  
 
     

Reply

Marsh Posté le 11-01-2009 à 23:34:47    

Super Neutrino a écrit :

ok, je le fermais avec [/code = python]  :jap:  
 

Code :
  1. t=zeros((1000, 100))
  2.  
  3. for x in range(1,1000):    
  4.     for i in range(1,100):
  5.         E[i]=random.gauss(mean,ecart) #distribution gaussienne en energie
  6.         
  7.         v[i]=c*sqrt(1-(mpion*c**2/E[i])**2)
  8.         Ga[i]=1/sqrt(1-(v[i]/c)**2)   #calculs intermediaires
  9.         GTAU[i]=Ga[i]*tau
  10.         
  11.         p=1-M.exp(-x/(v[i]*GTAU[i]))
  12.     t2=N.append(p,t2)
  13.         
  14.     print t2


 
J'aimerai avoir quelque chose comme [ [p(x=1, v1), ... , p(x=1, v100)], ... [p(x=1000, v1), ... , p(x=1000, v100)] ]. Mais quand je lance le programme il m'affiche pleins de tableaux (de plus de 100 colonnes) à la suite, ça n'a rien à voir avec mon tableau t.  
 
     


Déjà, les arrays Pytnon commencent à l'index 0, et range(a, b) crée une suite [a, b[, donc tes appels range(1, 1000) et range(1, 100) itèrent sur [1, 999] et [1, 99]. C'est vraiment ce que tu veux?
 
Ensuite, tu es sûr de comprendre ce que fait t2=N.append(p,t2)? C'est censé servir à quoi exactement? Je remarques également que tu ne remets jamais rien dans t, et que dans la première expression tu utilises un élément qui n'est pas défini dans la même scope (le scoping de Python le permet, mais c'est sale...)
 
Accessoirement, il y a une palanquée de valeurs dont la définition n'est pas indiquée (M, mean, ecart, mpion, E, ...)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 11-01-2009 à 23:34:47   

Reply

Marsh Posté le 11-01-2009 à 23:48:10    

Citation :

Déjà, les arrays Pytnon commencent à l'index 0, et range(a, b) crée une suite [a, b[, donc tes appels range(1, 1000) et range(1, 100) itèrent sur [1, 999] et [1, 99]. C'est vraiment ce que tu veux?  


 
Non, je ne savais pas  :sweat:  donc je vais jusqu'à 1001 ?
 

Citation :

Ensuite, tu es sûr de comprendre ce que fait t2=N.append(p,t2)? C'est censé servir à quoi exactement? Je remarques également que tu ne remets jamais rien dans t, et que dans la première expression tu utilises un élément qui n'est pas défini dans la même scope (le scoping de Python le permet, mais c'est sale...)  


 
 :sweat:  oui en effet je n'avais pas vu, je voulais plutôt mettre t=N.append(t,p). Le append c'est censé servir à ajouter des éléments à un tableau  :whistle: , donc il faudrait plutôt une commande qui remplace les 0 par mes p. Je ne comprend pas ce que tu veux dire par "scope". Je suis désolé si j'ai l'air nul c'est la première fois que je fais de la programmation :) je n'ai jamais eu de cours :sweat: juste un poly assez mal fait, donc j'apprends un peu sur le tas.
 

Citation :

Accessoirement, il y a une palanquée de valeurs dont la définition n'est pas indiquée (M, mean, ecart, mpion, E, ...)


 
M est un raccourci pour math, et pour le reste comme c'était assez long j'ai pas voulu encombrer:
 

Code :
  1. E=zeros(100, float)    
  2. p=zeros(100, float)
  3. v=zeros(100, float)
  4. Ga=zeros(100, float)
  5. GTAU=zeros(100, float)
  6.  
  7.  
  8. #definitions
  9.  
  10. mean=10*1.6*10**(-10) #moyenne de la gausienne
  11. ecart=1*1.6*10**(-10)
  12.  
  13. tau= 2.603305*10**(-8) #duree de vie moyenne des pions
  14. tau2= 2 #duree de vie moyenne des muons
  15. c= 3*10**8 #vitesse de la lumiere
  16. mpion= 139.5701835*10**(6)*1.783*10**(-36) #masse du pion en kg
  17. mmuon=1.88*10**(-28) #masse du muon en kg

Reply

Marsh Posté le 12-01-2009 à 00:08:43    

Super Neutrino a écrit :

Citation :

Déjà, les arrays Pytnon commencent à l'index 0, et range(a, b) crée une suite [a, b[, donc tes appels range(1, 1000) et range(1, 100) itèrent sur [1, 999] et [1, 99]. C'est vraiment ce que tu veux?  

 

Non, je ne savais pas  :sweat:  donc je vais jusqu'à 1001 ?


Non, tu vas jusqu'à 999 mais tu pars de 1 au lieu de partir de 0, donc tu ne parcours que 999 éléments et non 1000

 
Super Neutrino a écrit :

Citation :

Ensuite, tu es sûr de comprendre ce que fait t2=N.append(p,t2)? C'est censé servir à quoi exactement? Je remarques également que tu ne remets jamais rien dans t, et que dans la première expression tu utilises un élément qui n'est pas défini dans la même scope (le scoping de Python le permet, mais c'est sale...)  


 :sweat:  oui en effet je n'avais pas vu, je voulais plutôt mettre t=N.append(t,p). Le append c'est censé servir à ajouter des éléments à un tableau  :whistle: , donc il faudrait plutôt une commande qui remplace les 0 par mes p.


Ce serait t[x, i] (au passage pourquoi ne pas utiliser i et j?). append sert à étendre le tableau, donc à rajouter des éléments à la fin (en plus de ceux que tu as déjà), c'est sûrement pas ce que tu veux puisqu'avec ton initialisation tu as déjà créé un array qui a toutes les bonnes dimensions :D

Super Neutrino a écrit :

Je ne comprend pas ce que tu veux dire par "scope". Je suis désolé si j'ai l'air nul c'est la première fois que je fais de la programmation :) je n'ai jamais eu de cours :sweat: juste un poly assez mal fait, donc j'apprends un peu sur le tas.


La scope, c'est le domaine de définition (d'une variable habituellement). Donc les parties du code où elle existe (ou est censée exister). Pour te montrer un exemple:

Code :
  1. a = 0
  2. for i in range(42):
  3.    a = 5
  4.    b = 2
  5. # ici


la scope de a contient le for mais n'est pas limitée à celui-ci (puisqu'on a créé a avant de rentrer dans le for). Par contre celle de b est limitée à l'intérieur du for

 

Donc à l'emplacement ici on devrait pouvoir accéder à a mais pas à b.

 

Dans les faits, à cause de la manière dont Python fonctionne on peut accéder à b, mais il faut éviter de le faire aussi bien pour des raisons de style que de maintenabilité.

Super Neutrino a écrit :


Citation :

Accessoirement, il y a une palanquée de valeurs dont la définition n'est pas indiquée (M, mean, ecart, mpion, E, ...)

 

M est un raccourci pour math, et pour le reste comme c'était assez long j'ai pas voulu encombrer:


Ok :jap:

 

Là je vais aller me pieuter, je continuerais à regarder ça demain.


Message édité par masklinn le 12-01-2009 à 00:08:57

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 00:43:59    

Citation :

Non, tu vas jusqu'à 999 mais tu pars de 1 au lieu de partir de 0, donc tu ne parcours que 999 éléments et non 1000


 
Oui mais comme je veux des tableaux de 100, il faut que je parte de 1 et que j'aille à 101 (puisqu'il s'arrête à 100) ?
 

Citation :

Ce serait t[x, i] (au passage pourquoi ne pas utiliser i et j?). append sert à étendre le tableau, donc à rajouter des éléments à la fin (en plus de ceux que tu as déjà), c'est sûrement pas ce que tu veux puisqu'avec ton initialisation tu as déjà créé un array qui a toutes les bonnes dimensions :D

 
 
Ok, j'utilisais x car ça représente une distance en fait, mais i et j ça me va :jap: . Ca fait quoi t[x, i] ?  
 

Citation :

La scope, c'est le domaine de définition (d'une variable habituellement). Donc les parties du code où elle existe (ou est censée exister). Pour te montrer un exemple: ...


 
ok merci :)  
 

Citation :

Là je vais aller me pieuter, je continuerais à regarder ça demain.


 
bonne nuit  :hello:  et merci encore pour l'aide.

Reply

Marsh Posté le 12-01-2009 à 09:57:27    

Super Neutrino a écrit :

Citation :

Non, tu vas jusqu'à 999 mais tu pars de 1 au lieu de partir de 0, donc tu ne parcours que 999 éléments et non 1000


 
Oui mais comme je veux des tableaux de 100, il faut que je parte de 1 et que j'aille à 101 (puisqu'il s'arrête à 100) ?


Non, tu pars de 0 et tu vas jusqu'à 99, comme partout ailleurs en informatique (ou presque). C'est d'ailleurs précisément ce que donne range(100): ça donne une série de 100 entiers, en partant de 0

Super Neutrino a écrit :

Citation :

Ce serait t[x, i] (au passage pourquoi ne pas utiliser i et j?). append sert à étendre le tableau, donc à rajouter des éléments à la fin (en plus de ceux que tu as déjà), c'est sûrement pas ce que tu veux puisqu'avec ton initialisation tu as déjà créé un array qui a toutes les bonnes dimensions :D

 
 
Ok, j'utilisais x car ça représente une distance en fait


Ah ok dans ce cas ça me va [:romf]

Super Neutrino a écrit :

Ca fait quoi t[x, i] ?  


C'est un alias pour t[x][i], ça récupère l'élément en position (x, i) dans ton tableau.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 11:34:18    

ok, ça à l'air de marcher comme ça, mais je poste quand même mon code car j'ai un autre petit problème après  :whistle:  
 

Code :
  1. t=zeros((1000, 100))
  2.  
  3. for x in range(0,1000):    
  4.     for i in range(0,100):
  5.         E[i]=random.gauss(mean,ecart) #distribution gaussienne en energie
  6.         
  7.         v[i]=c*sqrt(1-(mpion*c**2/E[i])**2)
  8.         Ga[i]=1/sqrt(1-(v[i]/c)**2)   #calculs intermediaires
  9.         GTAU[i]=Ga[i]*tau
  10.         p=1-M.exp(-x/(v[i]*GTAU[i]))
  11.         t[x][i]=p

Reply

Marsh Posté le 12-01-2009 à 11:48:55    

Super Neutrino a écrit :

ok, ça à l'air de marcher comme ça, mais je poste quand même mon code car j'ai un autre petit problème après  :whistle:

 
Code :
  1. t=zeros((1000, 100))
  2.  
  3. for x in range(0,1000):    
  4.     for i in range(0,100):
  5.         E[i]=random.gauss(mean,ecart) #distribution gaussienne en energie
  6.         
  7.         v[i]=c*sqrt(1-(mpion*c**2/E[i])**2)
  8.         Ga[i]=1/sqrt(1-(v[i]/c)**2)   #calculs intermediaires
  9.         GTAU[i]=Ga[i]*tau
  10.         p=1-M.exp(-x/(v[i]*GTAU[i]))
  11.         t[x][i]=p



Quelques modifs supplémentaires:

  • Comme je l'ai indiqué plus haut, range(0, a) peut être écrit range(a), c'est équivalent, pas la peine de mettre le 0 donc
  • As tu vraiment besoin de E, GTAU, v et Ga (d'avoir des arrays je veux dire)? Je ne vois pas trop où tu les utilise en dehors de ton calcul
  • Habituellement (en python), la convention est de mettre les noms constantes en majuscules, donc MEAN, STDEV, TAU, MPION, ...
  • Ta variable intermédiaire p (dans les deux dernières lignes) ne sert à rien
  • Eviter de mélanger anglais (mean) et français (ecart), tout mettre en anglais dans l'idéal
  • La PEP8 (Style Guide for Python Code) suggère que les opérateurs binaires (=, +, -, ==, /, *) soient entourés d'espaces, et que dans les listes d'arguments les virgules soient suivies d'un espace, donc:
Code :
  1. for x in range(1000):    
  2.    for i in range(100):
  3.        E[i] = random.gauss(MEAN, STDEV) # distribution gaussienne en energie
  4.         
  5.        v[i] = c * sqrt(1 - (MPION * c**2 / E[i])**2)
  6.        Ga[i] = 1 / sqrt(1 - (v[i] / c)**2) # calculs intermediaires
  7.        GTAU[i] = Ga[i] * TAU
  8.        t[x][i] = 1 - M.exp(-x / (v[i] * GTAU[i]))


Message édité par masklinn le 12-01-2009 à 11:50:33

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 12:08:14    

Merci pour les petites modifications :jap: . Non je n'ai pas vraiment besoin des v GTAU et GA, c'était juste pour pas avoir une trop grosse expression.
 
J'ai un autre petit problème  :sweat: . Maintenant mon but est de faire des test, je tire un nombre aléatoire K, et je regarde pour les valeurs dans mon tableau quelle sont celles qui sont supérieures à K, si elles le sont alors je remplace ces valeurs par une autre probabilité (c'est un peu tordu je sais  :whistle: ) et je refais le test sur le nombre K, si  
elles sont plus grandes j'ajoute un 3 dans un nouveau tableau t2, sinon un 1. Et si elles ne vérifient pas le test de départ je met un 0.
 

Code :
  1. K = N.random.uniform(0.78,0.85)
  2.  
  3. t2 = zeros((1000, 100))
  4.  
  5. for x in range(1000):  
  6.     for i in range (100):        
  7.         if t[x][i] > K:
  8.             v2[i] = c*sqrt(1-(MMUON*c**2/E[i])**2)
  9.             gtau2[i] = TAU/sqrt(1 - (v2[i]/c)**2)        
  10.             t[x][i] = 1 - M.exp(- 999/(v2[i]*gtau2[i]))
  11.                if t[x][i] > K:
  12.                     t2[x][i] = 3
  13.                 else:
  14.                     t2[x][i] = 1
  15.                     
  16.         else:
  17.             t[x][i] = 0


 
Il m'affiche bien un tableau avec des 3 des 1 et des 0 (par exemple quand je lui demande t2[999]) mais j'ai vérifié si ça collait (car je m'étonnais de ne jamais avoir de 0) et ça marche un peu de travers, il remplace souvent toutes les valeurs par une même valeur alors que je lui demande de les tester une par une.

Message cité 1 fois
Message édité par Super Neutrino le 12-01-2009 à 12:10:12
Reply

Marsh Posté le 12-01-2009 à 12:19:42    

Super Neutrino a écrit :

Merci pour les petites modifications :jap: . Non je n'ai pas vraiment besoin des v GTAU et GA, c'était juste pour pas avoir une trop grosse expression.


Rien ne t'empêche d'avoir juste des variables locales dans ton code, pas besoin de tableaux pour ça ;)

 

Exemple:

Code :
  1. for x in range(1000):    
  2.    for i in range(100):
  3.        e = random.gauss(MEAN, STDEV) # distribution gaussienne en energie
  4.         
  5.        v = c * sqrt(1 - (MPION * c**2 / e)**2)
  6.        ga = 1 / sqrt(1 - (v / c)**2) # calculs intermediaires
  7.        gtau = ga * TAU
  8.        t[x][i] = 1 - M.exp(-x / (v * gtau))


Et tu peux dégager toutes les déclarations en zeros(100, float) au début du script, comme ça :)

Super Neutrino a écrit :

J'ai un autre petit problème  :sweat: . Maintenant mon but est de faire des test, je tire un nombre aléatoire K, et je regarde pour les valeurs dans mon tableau quelle sont celles qui sont supérieures à K, si elles le sont alors je remplace ces valeurs par une autre probabilité (c'est un peu tordu je sais  :whistle: ) et je refais le test sur le nombre K, si
elles sont plus grandes j'ajoute un 3 dans un nouveau tableau t2, sinon un 1. Et si elles ne vérifient pas le test de départ je met un 0.

 
Code :
  1. K = N.random.uniform(0.78,0.85)
  2.  
  3. t2 = zeros((1000, 100))
  4.  
  5. for x in range(1000):  
  6.     for i in range (100):        
  7.         if t[x][i] > K:
  8.             v2[i] = c*sqrt(1-(MMUON*c**2/E[i])**2)
  9.             gtau2[i] = TAU/sqrt(1 - (v2[i]/c)**2)        
  10.             t[x][i] = 1 - M.exp(- 999/(v2[i]*gtau2[i]))
  11.                if t[x][i] > K:
  12.                     t2[x][i] = 3
  13.                 else:
  14.                     t2[x][i] = 1
  15.                     
  16.         else:
  17.             t[x][i] = 0

Il m'affiche bien un tableau avec des 3 des 1 et des 0 (par exemple quand je lui demande t2[999]) mais j'ai vérifié si ça collait (car je m'étonnais de ne jamais avoir de 0) et ça marche un peu de travers, il remplace souvent toutes les valeurs par une même valeur alors que je lui demande de les tester une par une.


Il est normal que ton calcul dans ce code là soit complètement différent de l'autre (notamment le M.exp(- 999/(v2[i]*gtau2[i])) alors que l'autre utilise -x?

 

Accessoirement, tu devrais peut-être extraire les calculs physiques dans des fonctions histoire de bien séparer les calculs du flux du code, et je suggère d'inverser la condition de ton if en t[x][i] <= K, de cette manière tu auras d'abord l'expression la plus simple. Et accessoirement dans cette expression tu set t à 0, pas t2, c'est normal?
(et arrêtes d'utiliser des tableaux là où tu n'en as pas besoin la seule chose que ça fasse c'est rendre le code moins lisible)


Message édité par masklinn le 12-01-2009 à 12:20:20

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 12:32:55    

Citation :

Il est normal que ton calcul dans ce code là soit complètement différent de l'autre (notamment le M.exp(- 999/(v2[i]*gtau2[i])) alors que l'autre utilise -x?


 
Je me suis trompé  
 

Code :
  1. t2=zeros((1000, 100))
  2.  
  3. for x in range(1000):  
  4.     for i in range (100):        
  5.         if t[x][i] <= K:
  6.             v2[i]=c*sqrt(1-(MMUON*c**2/E[i])**2)
  7.             gtau2[i]=tau/sqrt(1-(v2[i]/c)**2)        
  8.             t[x][i]=1-M.exp(-x/(v2[i]*gtau2[i]))
  9.                if t[x][i] > K:
  10.                     t2[x][i]=3
  11.                 else:
  12.                     t2[x][i]=1
  13.                     
  14.         else:
  15.             t[x][i]=0


 

Citation :

Rien ne t'empêche d'avoir juste des variables locales dans ton code, pas besoin de tableaux pour ça ;)


 
Je n'ai jamais rencontré ce terme, comment ça marche ? je vois pas trop car là mes fonctions dépendent des E(i) donc des i.
 

Citation :

Accessoirement, tu devrais peut-être extraire les calculs physiques dans des fonctions histoire de bien séparer les calculs du flux du code


 
Ok, mais j'ai pas encore vraiment vu comment on utilise les fonctions dans python.

Reply

Marsh Posté le 12-01-2009 à 12:47:22    

Super Neutrino a écrit :

Citation :

Il est normal que ton calcul dans ce code là soit complètement différent de l'autre (notamment le M.exp(- 999/(v2*gtau2[i])) alors que l'autre utilise -x?


 
Je me suis trompé  
 

Code :
  1. t2=zeros((1000, 100))
  2.  
  3. for x in range(1000):  
  4.     for i in range (100):        
  5.         if t[x][i] <= K:
  6.             v2[i]=c*sqrt(1-(MMUON*c**2/E[i])**2)
  7.             gtau2[i]=tau/sqrt(1-(v2[i]/c)**2)        
  8.             t[x][i]=1-M.exp(-x/(v2[i]*gtau2[i]))
  9.                if t[x][i] > K:
  10.                     t2[x][i]=3
  11.                 else:
  12.                     t2[x][i]=1
  13.                     
  14.         else:
  15.             t[x][i]=0


 

Citation :

Rien ne t'empêche d'avoir juste des variables locales dans ton code, pas besoin de tableaux pour ça ;)


 
Je n'ai jamais rencontré ce terme, comment ça marche ? je vois pas trop car là mes fonctions dépendent des E(i) donc des i.


Elles ne dépendent que de E[i], donc tu gardes E en array, mais pas le reste.
 
Il suffit de transformer  

Code :
  1. v2[i]=c*sqrt(1-(MMUON*c**2/E[i])**2)
  2. gtau2[i]=tau/sqrt(1-(v2[i]/c)**2)        
  3. t[x][i]=1-M.exp(-x/(v2[i]*gtau2[i]))


en

Code :
  1. v2 = c * sqrt(1 - (MMUON * c**2 / E[i])**2)
  2. gtau2 = tau / sqrt(1 - (v2 / c)**2)        
  3. t[x][i]=1 - M.exp(-x / (v2 * gtau2))


Et d'enlever les déclarations type [i]v2 = zeros(100, float)
 
À noter aussi que ton premier script indique que chaque valeur de E[i] va être écrasée et réécrite 1000 fois, et que le script d'après utilisera uniquement le résultat de la dernière écriture, tu voudras peut-être penser à ça [:petrus75]

Super Neutrino a écrit :


Citation :

Accessoirement, tu devrais peut-être extraire les calculs physiques dans des fonctions histoire de bien séparer les calculs du flux du code


 
Ok, mais j'ai pas encore vraiment vu comment on utilise les fonctions dans python.


Tu devrais passer quelques minutes à lire le tuto officiel Python, il n'est ni long ni compliqué ;)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 13:07:13    

Citation :

À noter aussi que ton premier script indique que chaque valeur de E[i] va être écrasée et réécrite 1000 fois, et que le script d'après utilisera uniquement le résultat de la dernière écriture, tu voudras peut-être penser à ça [:petrus75]  


 
Ok, donc il faut que je sépare mes boucles ?  
 

Code :
  1. t=zeros((1000, 100))
  2.  
  3. for i in range(100):
  4.     E[i] = random.gauss(MEAN,DEVIATION) #distribution gaussienne en energie
  5.     v = c * sqrt(1 - (MPION * c**2/E[i])**2)
  6.     Ga = TAU / sqrt(1 - (v / c)**2)   #calculs intermediaires
  7.  
  8. for x in range(1000):    
  9.     for i in range(100):
  10.         t[x][i] = 1 - M.exp(- x / (v * Ga))


 

Citation :

Tu devrais passer quelques minutes à lire le tuto officiel Python, il n'est ni long ni compliqué ;)


 
Ok je vais regarder ça :)

Reply

Marsh Posté le 12-01-2009 à 13:20:29    

Super Neutrino a écrit :

Citation :

À noter aussi que ton premier script indique que chaque valeur de E[i] va être écrasée et réécrite 1000 fois, et que le script d'après utilisera uniquement le résultat de la dernière écriture, tu voudras peut-être penser à ça [:petrus75]  

 

Ok, donc il faut que je sépare mes boucles ?

 
Code :
  1. t=zeros((1000, 100))
  2.  
  3. for i in range(100):
  4.     E[i] = random.gauss(MEAN,DEVIATION) #distribution gaussienne en energie
  5.     v = c * sqrt(1 - (MPION * c**2/E[i])**2)
  6.     Ga = TAU / sqrt(1 - (v / c)**2)   #calculs intermediaires
  7.  
  8. for x in range(1000):    
  9.     for i in range(100):
  10.         t[x][i] = 1 - M.exp(- x / (v * Ga))



Uniquement la création de E[i], tes calculs de v et ga dépendent de E[i] mais sont locaux à l'obtention de t[x][i], donc

Code :
  1. for i in range(100):
  2.    E[i] = random.gauss(MEAN,DEVIATION) #distribution gaussienne en energie
  3.  
  4. for x in range(1000):    
  5.    for i in range(100):
  6.        v = c * sqrt(1 - (MPION * c**2/E[i])**2)
  7.        Ga = TAU / sqrt(1 - (v / c)**2)   #calculs intermediaires
  8.        t[x][i] = 1 - M.exp(- x / (v * Ga))


plutôt.

 

Et accessoirement tu pourrais simplifier et unifier la définition de da distro gaussienne en énergie en utilisant une listcomp:

 

Au lieu de

Code :
  1. E=zeros(100, float)  
  2.  
  3. for i in range(100):
  4.    E[i] = random.gauss(MEAN,DEVIATION) #distribution gaussienne en energie


tu peux écrire plus simplement

Code :
  1. E = N.array([random.gauss(MEAN, STDEV) for i in range(100)], dtype=float)


Message édité par masklinn le 12-01-2009 à 13:21:05

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 13:42:34    

merci :jap: ça à l'air de fonctionner maintenant  :ouch: , c'était surement à cause des valeurs de E[i].
 
Je poste mon code au cas ou tu aurais d'autres remarques:
 

Code :
  1. K=N.random.uniform(0.75,0.85)
  2.  
  3. print K
  4.  
  5. t2=zeros((1000, 100))
  6.  
  7. for x in range(1000):  
  8.     for i in range (100):        
  9.         if t[x][i] >= K:
  10.             v2 = c * sqrt(1 - (MMUON * c**2 / E[i])**2)
  11.             ga2 = tau / sqrt(1 - (v2 / c)**2)        
  12.             t[x][i] = 1 - M.exp(-x / (v2 * ga2))
  13.             if t[x][i] >= K:
  14.                 t2[x][i] = 3
  15.             else:
  16.                 t2[x][i] = 1
  17.                     
  18.         else:
  19.             t2[x][i] = 0

Reply

Marsh Posté le 12-01-2009 à 13:48:44    

Super Neutrino a écrit :

merci :jap: ça à l'air de fonctionner maintenant  :ouch: , c'était surement à cause des valeurs de E[i].
 
Je poste mon code au cas ou tu aurais d'autres remarques:
 

Code :
  1. K=N.random.uniform(0.75,0.85)
  2.  
  3. print K
  4.  
  5. t2=zeros((1000, 100))
  6.  
  7. for x in range(1000):  
  8.     for i in range (100):        
  9.         if t[x][i] >= K:
  10.             v2 = c * sqrt(1 - (MMUON * c**2 / E[i])**2)
  11.             ga2 = tau / sqrt(1 - (v2 / c)**2)        
  12.             t[x][i] = 1 - M.exp(-x / (v2 * ga2))
  13.             if t[x][i] >= K:
  14.                 t2[x][i] = 3
  15.             else:
  16.                 t2[x][i] = 1
  17.                     
  18.         else:
  19.             t2[x][i] = 0



Code :
  1. K = N.random.uniform(0.75, 0.85)
  2.  
  3. print K
  4.  
  5. t2 = zeros((1000, 100))


Ne pas oublier les espaces, c'est plus joli et lisible ;)
 

Code :
  1. for x in range(1000):  
  2.     for i in range (100):        
  3.         if t[x][i] >= K:
  4.             v2 = c * sqrt(1 - (MMUON * c**2 / E[i])**2)
  5.             ga2 = tau / sqrt(1 - (v2 / c)**2)        
  6.             t[x][i] = 1 - M.exp(-x / (v2 * ga2))
  7.             if t[x][i] >= K:
  8.                 t2[x][i] = 3
  9.             else:
  10.                 t2[x][i] = 1
  11.                     
  12.         else:
  13.             t2[x][i] = 0


Comme dit au dessus, j'inverserais la condition, ce qui demande aussi d'inverser les clauses:

Code :
  1. for x in range(1000):  
  2.    for i in range (100):        
  3.        if t[x][i] < K:
  4.            t2[x][i] = 0                     
  5.        else:
  6.            v2 = c * sqrt(1 - (MMUON * c**2 / E[i])**2)
  7.            ga2 = tau / sqrt(1 - (v2 / c)**2)        
  8.            t[x][i] = 1 - M.exp(-x / (v2 * ga2))
  9.            if t[x][i] >= K:
  10.                t2[x][i] = 3
  11.            else:
  12.                t2[x][i] = 1


Et pour rester cohérent, on inverse aussi la seconde condition (ça ne change rien, mais ça permet d'avoir le même test aux deux endroits, donc c'est plus clair):

Code :
  1. for x in range(1000):  
  2.    for i in range (100):        
  3.        if t[x][i] < K:
  4.            t2[x][i] = 0                     
  5.        else:
  6.            v2 = c * sqrt(1 - (MMUON * c**2 / E[i])**2)
  7.            ga2 = tau / sqrt(1 - (v2 / c)**2)        
  8.            t[x][i] = 1 - M.exp(-x / (v2 * ga2))
  9.            if t[x][i] < K:
  10.                t2[x][i] = 1
  11.            else:
  12.                t2[x][i] = 3


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-01-2009 à 14:37:11    

:jap: ok, merci beaucoup encore une fois, j'ai appris pleins de choses  :jap:  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed