[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