[Python-de] While Schleife
Peter Otten
__peter__ at web.de
Mit Apr 27 08:08:57 CEST 2005
Am Dienstag, 26. April 2005 13:40 schrieb Dr. Werner Pessenhofer:
> ich versuche gerade mit Hilfe von Numerical Python, matplotlib und python
> aus einem ascii Datenfile automatisiert Spektren zu plotten. Hierzu wird
> der file zuerst als array geladen.
> Zum Plotten wird als x - Wert der Wert aus der ersten Spalte genommen, der
> y - Wert kommt dann jeweils aus der zweiten, vierten, sechsten usw. Spalte.
In Python starten Indizes bei 0, das heißt m[:,1] ist die zweite Spalte.
> Ich habe versucht, dass unter Zuhilfenahme einer while Schleife zu lösen:
>
> #!/usr/bin/python
>
> from pylab import *
>
> X = load('Spektren-CuP-conv.dat',comments='#')
>
# wahrscheinlich hat die Matrix nicht die erwartete Form - überprüfen lässt
# sich das mit
import Numeric # oder numarray?
print Numeric.shape(X)
> y = 0
> while y <= 18:
> y = y + 2
> x = X[:,1]
> y1 = X[:,y]
> plot (y1,x,'-')
Auf lange Sicht ist es keine gute Idee, die Dimensionen der Matrix fest zu
kodieren. Idiomatisches Python (kenne mich mit Numeric nicht so aus) könnte
zum Beispiel sein:
# ungetestet
X = Numeric.transpose(X)
x = X[0] # bzw. X[1] *
for y in X[1::2]: # bzw. X[2::2] *
plot(x, y)
(*) falls Dir klar war, dass Indizes mit 0 starten
> Das erste Spektrum (Spalte 1 und 2 aus dem array) wird noch geplottet,
> allerdings tritt dann folgende Fehlermeldung auf:
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "/usr/tmp/python-25858Gby.py", line 11, in ?
> y1 = X[:,y]
> IndexError: invalid index
>
> >>> ## working on region in file /usr/tmp/python-258584kB.py...
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> File "/usr/tmp/python-258584kB.py", line 11, in ?
> y1 = X[:,y]
> IndexError: invalid index
>
> Soweit ich das verstehe, heißt das, dass beim zweiten Durchlauf der
> Schleife (der erste scheint erfolgreich abgeschlossen zu werden, da das
> erste Spektrum geplottet wird) der Wert y nicht mehr definiert zu sein
> scheint.
Glaube ich nicht. Numeric beschwert sich (auch?) über einen "invalid index",
wenn dieser Zellen außerhalb der Matrix bezeichnet. Ein undefinierter
Bezeichner erzeugt dagegen einen NameError.
Peter