[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