Brauche kurz eine comprehensions übersetzung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Hi,

Ich will eine for schleife in eine comprehension übersetzen, der schnelligkeit halber, aber ich steh bei der syntax grad aufm schlauch....

ich hab die variable data, ein 3 dimensionales array. data[x][y][z] wobei jede dimension ein paar hundert einträge hat.

nun will ich eine Liste raus schreiben die aus den werten einer speziellen dimension besteht.

mIttels for schleife würde das lauten:

Code: Alles auswählen

liste = []
for z in range(0,100):
  liste.append(data[0][0][z])
ich war nun eigentlich der Meinung das man das in folgendes übersetzen kann:

Code: Alles auswählen

liste = data[0,0,0:100]
Aber da krieg ich ständig "invalid index".

Könnt ihr mir da mal grad sagen wie die richtige Übersetzung dieser for schleife lautet?
thx.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
mIttels for schleife würde das lauten:
Als bei mir wirft dies Schleife einen "Type Error"... Mit [z] rufst die auch das z-te Elemente der Liste auf - welches es ja nicht gibt, weil die Liste leer ist.

Eine List-Comprehension funktioniert z.B. so:

Code: Alles auswählen

>>> [[0,0,x] for x in range(0,10)]
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [0, 0, 6], [0, 0, 7], [0, 0, 8], [0, 0, 9]]
Gruß, noisefloor
BlackJack

@Arp: Was ist `data` denn für ein Typ? Bei mehreren hundert Einträgen pro Dimension würde ich mal ein Auge auf `numpy` werfen, denn soviel schneller ist eine „list comprehension“ (LC) dann auch nicht. Schleifen von dem Ausmass würde ich mittels `numpy`-Arrays und „slicing“ umsetzen. Die passieren dann in C oder Fortran, oder unter Umständen sogar *gar nicht*, denn nach Möglichkeit wird bei `numpy` nur eine andere Sicht auf die Originaldaten erzeugt in dem in dem neuen Objekt andere Werte für Versatz, „strides“, usw. gespeichert werden. Vielleicht meintest Du „slicing“ ja sogar, denn eine LC hast Du gar nicht gezeigt.
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

Arp hat geschrieben: ich hab die variable data, ein 3 dimensionales array. data[x][y][z] wobei jede dimension ein paar hundert einträge hat.

nun will ich eine Liste raus schreiben die aus den werten einer speziellen dimension besteht.

mIttels for schleife würde das lauten:

Code: Alles auswählen

liste = []
for z in range(0,100):
  liste.append(data[0][0][z])
ich war nun eigentlich der Meinung das man das in folgendes übersetzen kann:

Code: Alles auswählen

liste = data[0,0,0:100]
Seltsam. Die direkte Übersetzung wäre doch (ungetestet)

Code: Alles auswählen

liste = data[0][0][0:100]
Vermutlich willst du sogar ":" statt "0:100" schreiben.
Arp
User
Beiträge: 65
Registriert: Dienstag 15. März 2011, 13:21

Danke für eure Hilfe!

@noisefloor
Das würde nicht das Ergebnis ausspucken das ich haben will. Das gibt ja eine liste aus tupeln, während ich nur eine Liste aus zahlen dieser letzten Dimension wollte.

@Blackjack
Streng genommen ist das Array etwas komplexer... es ist eine liste aus Fits_records, falls dir das was sagt. Ein element besteht aus 10 einträgen, und eins davon ist nochmals ein array. Dessen Einträge sind dann alles 32bit floats.
Werd mir mal numpy slices angucken... ich erinner mich das ich neulich mal nach slices gegoogelt hab, aber da nicht wirklich fündig wurde.

@bords0
Danke! Ich könnte aber schwören das ich das gestern ausprobiert hatte und es nicht funktioniert hat....

Liegt das vll an unterschiedlichen Python Versionen? Zuhause in Ubuntu 10.04 hab ich python 2.6, hier aber python 2.7.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Liegt das vll an unterschiedlichen Python Versionen
Nein.

Gruß, noisefloor
Antworten