Python, problème avec les tableaux - Python - Programmation
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
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 ?
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.
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.
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 :
|
?
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.
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 j'aimerai bien poster mon code mais le bloc [code=python] n'a pas l'air de marcher.
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])
Marsh Posté le 11-01-2009 à 23:20:57
ok, je le fermais avec [/code = python]
Code :
|
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.
Marsh Posté le 11-01-2009 à 23:34:47
Super Neutrino a écrit : ok, je le fermais avec [/code = python]
|
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, ...)
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 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...) |
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 , 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 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 :
|
Marsh Posté le 12-01-2009 à 00:08:43
Super Neutrino a écrit :
Non, je ne savais pas 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 :
|
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
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 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 :
|
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 :
M est un raccourci pour math, et pour le reste comme c'était assez long j'ai pas voulu encombrer: |
Ok
Là je vais aller me pieuter, je continuerais à regarder ça demain.
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 |
Ok, j'utilisais x car ça représente une distance en fait, mais i et j ça me va . 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 et merci encore pour l'aide.
Marsh Posté le 12-01-2009 à 09:57:27
Super Neutrino a écrit :
|
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 :
|
Ah ok dans ce cas ça me va
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.
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
Code :
|
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
|
Quelques modifs supplémentaires:
Code :
|
Marsh Posté le 12-01-2009 à 12:08:14
Merci pour les petites modifications . 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 . 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 ) 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 :
|
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.
Marsh Posté le 12-01-2009 à 12:19:42
Super Neutrino a écrit : Merci pour les petites modifications . 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 :
|
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 . 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 ) et je refais le test sur le nombre K, si
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)
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 :
|
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.
Marsh Posté le 12-01-2009 à 12:47:22
Super Neutrino a écrit :
|
Elles ne dépendent que de E[i], donc tu gardes E en array, mais pas le reste.
Il suffit de transformer
Code :
|
en
Code :
|
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
Super Neutrino a écrit :
|
Tu devrais passer quelques minutes à lire le tuto officiel Python, il n'est ni long ni compliqué
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 |
Ok, donc il faut que je sépare mes boucles ?
Code :
|
Citation : Tu devrais passer quelques minutes à lire le tuto officiel Python, il n'est ni long ni compliqué |
Ok je vais regarder ça
Marsh Posté le 12-01-2009 à 13:20:29
Super Neutrino a écrit :
Ok, donc il faut que je sépare mes boucles ?
|
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 :
|
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 :
|
tu peux écrire plus simplement
Code :
|
Marsh Posté le 12-01-2009 à 13:42:34
merci ça à l'air de fonctionner maintenant , c'était surement à cause des valeurs de E[i].
Je poste mon code au cas ou tu aurais d'autres remarques:
Code :
|
Marsh Posté le 12-01-2009 à 13:48:44
Super Neutrino a écrit : merci ça à l'air de fonctionner maintenant , c'était surement à cause des valeurs de E[i].
|
Code :
|
Ne pas oublier les espaces, c'est plus joli et lisible
Code :
|
Comme dit au dessus, j'inverserais la condition, ce qui demande aussi d'inverser les clauses:
Code :
|
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 :
|
Marsh Posté le 12-01-2009 à 14:37:11
ok, merci beaucoup encore une fois, j'ai appris pleins de choses
Marsh Posté le 08-01-2009 à 21:57:35
Bonsoir
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
Merci d'avance