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

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

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

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: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

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

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: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

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

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: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

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:

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

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: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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:

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: 96
Registriert: Donnerstag 4. Mai 2006, 18:39

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

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:

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Du willst doch nicht auf ein dict immer mit foo.get('bar') zugreifen, ebenso nicht auf Arrays, oder?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

es ging mir speziel um :,:
Die Zeichen haben mich einfach verwirrt ich habe zwanghaft eine Bedeutung in dieser Kombination gesucht.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sr4l hat geschrieben:es ging mir speziel um :,:
Naja, eine Programiersprache zeichnet sich dadurch aus, dass du Syntaxkonstrukte oft in vielen verschiedenen Situationen einsetzen kannst. Das Komma bedeutet einfach nur Tupelbildung, das kann ja im großen und ganzen quasi überall stehen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Sr4l: "es ist gültiger Python-Code" heißt, es gibt keinen SyntaxError. Dass die eingebauten Objekte wie list oder tuple diese Art von Subscript nicht akzeptieren, ist eine andere Geschichte.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten