Komische Notation: a[:,:]

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.
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Montag 21. April 2008, 11:41

Hallo,

ich habe jetzt diverse Bücher durchsucht, Foren, andere Python-Seiten, aber keine dieser Quellen kennt folgende Notation:

Code: Alles auswählen

toprow = tdraw.get_pixel_rgn(0, 0, tdraw.width, cellsize)
for i in range(1,n):
row = tdraw.get_pixel_rgn(0, i*cellsize, tdraw.width, cellsize)
row[:,:] = toprow[:,:]
Hierbei handelt es sich um einen Ausschnitt aus einem Python-Gimp-Plugin. Was bedeutet denn die letzte Zeile:
row[:,:] = toprow[:,:] ??
Wenn ich das in ipython eintippe, bekomme ich nur Errors, aber als Skript in Gimp funktioniert es. Ist das was Gimp spezifisches oder kennt Python wirklich diese Angabe von Indizes? Und wenn ja was bedeutet das denn?
lunar

Montag 21. April 2008, 13:05

Das Beispiel ist kein gültiger Python-Code, falls du das wissen wolltest.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Montag 21. April 2008, 13:08

Im Prinzip ist spam[:,:] ist im Prinzip nichts anderes als spam[key], wobei `key` hierbei ein Tupel ist, das zwei `slice`-Objekte beinhaltet.
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Montag 21. April 2008, 13:09

In Gimp funktioniert es... vielleicht ist es eine spezielle Klasse, die dann so ein Indizes-Geraffel zulässt... naja ich wollte nur wissen ob es sich dabei um normale Python-Notierung handelt, aber dem ist wohl nicht so... alles klar!
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Montag 21. April 2008, 13:12

Die Notation ist schon "normal", das wird z.B. in numpy/numarray/Numeric verwendet. Aber die Einrückung der Schleife stimmt im Beispiel nicht.
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Montag 21. April 2008, 13:18

ja gut die Einrückung ist wurscht, da habe ich komisch gepasted. Also gibt es diese Notation doch?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Montag 21. April 2008, 13:22

Ja, ergibt

Code: Alles auswählen

row.__setitem__((slice(None, None, None), slice(None, None, None)), toprow.__getitem__((slice(None, None, None), slice(None, None, None)))
Edit: Code gefixt.
Zuletzt geändert von Trundle am Montag 21. April 2008, 13:25, insgesamt 1-mal geändert.
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Montag 21. April 2008, 13:23

Aber irgendwie kann ich es ja so nicht in ipython verwenden, muss ich dann noch numpy oder so einbinden?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Montag 21. April 2008, 13:54

Von was ist denn "toprow" eine Instanz? Welchen Typ hat es?
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Montag 21. April 2008, 14:01

Naja irgendwas Gimp-spezifisches, ich kann im Moment leider nicht nachschauen. Mir ging es ja eigentlich auch nur darum, ob es sich bei dieser Notation um "normales" Python handelt oder ob es ein Sonderfall ist. Scheint ja dann eher ein Sonderfall zu sein...
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Montag 21. April 2008, 15:09

Das ist ganz normales Python:

Code: Alles auswählen

>>> class Spam(object):
	def __getitem__(self, name):
		print name


>>> s[:,:]
(slice(None, None, None), slice(None, None, None))
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Montag 21. April 2008, 20:24

EyDu hat geschrieben:Das ist ganz normales Python:

Code: Alles auswählen

>>> class Spam(object):
	def __getitem__(self, name):
		print name


>>> s[:,:]
(slice(None, None, None), slice(None, None, None))
Normal?

Bitte mal erklären.
Ich schaffe es nicht, das es gültiger Pythoncode wird.
Das geht (logisch)!:

Code: Alles auswählen

s = (1,2,3,4,5,6,7)
s[:]
Aber ein "," dazwischen?
Benutzeravatar
TheGrudge
User
Beiträge: 91
Registriert: Donnerstag 4. Mai 2006, 18:39

Montag 21. April 2008, 20:29

Ja ich verstehe das auch nicht... Ui Eschwege... meine Verwandten wohnen dort... naja fast, in Eltmannshausen... nur mal so am Rande :)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Montag 21. April 2008, 20:33

Code: Alles auswählen

class Multiplier(object):
    
    def __init__(self, multiplier):
        self.multiplier = multiplier
        
    def mul(self, value):
        return self.multiplier * value

    def __getitem__(self, value):
        print "You wanna get %sx%s?" % (value, self.multiplier)
        print "Yeah...here is it!"
        return self.mul(value)

seven = Multiplier(7)
print seven.mul(10)
print seven[10]

print seven['*']
print seven.mul('*')

print seven[:,:]
foo[bar] ist nichts weiter als syntakischer Zucker für foo.__getitem__(bar)
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Montag 21. April 2008, 20:40

audax hat geschrieben: foo[bar] ist nichts weiter als syntakischer Zucker für foo.__getitem__(bar)
Das wollt ich wissen danke.
Der nutzen sei aber mal dahingestellt.

@TheGrudge: Ich wohne auch nicht in Eschwege, aber im schönen Reichensachsen.
Antworten