[Python-de] While Schleife
Dr. Werner Pessenhofer
w.pessenhofer at tugraz.at
Mit Apr 27 09:56:25 CEST 2005
Ich habe es inzwischen etwas anders gelöst:
ind = 1
while ind < 18:
Y = take(X,(0,ind), 1)
x = Y[:,0]
y = Y[:,1]
plot(x,y,'-')
ind = ind + 2
Damit hole ich aus X (dem ursprünglichen array) die beiden Spalten heraus,
die ich brauche, und plotte sie dann jeweils extra.
Mit hardcoding meinst du wahrscheinlich:
ind < 18
Ich würde das gerne vermeiden, da der shape des arrays differieren kann
(je nachdem, wieviel Spektren aufgenommen werden), ich weiß allerdings
nicht, wie ich zur aktuellen Spaltenanzahl komme.
Mit
X = load('Spektren-CuP-conv.dat',comments='#')
print shape(X)
erhalte ich
(911, 18)
Daraus ist ersichtlich, dass das array X 18 Spalten hat, nur wie bekomme
ich das in eine Variable, die ich benutzen kann ?
Beschäftige mich erst seit einigen Tagen mit python und matplotlib, daher
bitte die naiven Fragen zu entschuldigen
lg
Werner
On Wed, 27 Apr 2005 09:43:14 +0200, Dr. Werner Pessenhofer
<w.pessenhofer at tugraz.at> wrote:
> 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
>
--
DI Dr. Werner Pessenhofer
CPA - Computer Process Automation
Plüddemanngasse 33
8010 Graz
Tel.: +43 (0) 676 346 70 08
FAX: +43 (0) 316 873 8772