Seite 1 von 1

Komische Notation: a[:,:]

Verfasst: Montag 21. April 2008, 11:41
von TheGrudge
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?

Re: Komische Notation: a[:,:]

Verfasst: Montag 21. April 2008, 13:05
von lunar
Das Beispiel ist kein gültiger Python-Code, falls du das wissen wolltest.

Verfasst: Montag 21. April 2008, 13:08
von Trundle
Im Prinzip ist spam[:,:] ist im Prinzip nichts anderes als spam[key], wobei `key` hierbei ein Tupel ist, das zwei `slice`-Objekte beinhaltet.

Verfasst: Montag 21. April 2008, 13:09
von TheGrudge
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!

Verfasst: Montag 21. April 2008, 13:12
von Trundle
Die Notation ist schon "normal", das wird z.B. in numpy/numarray/Numeric verwendet. Aber die Einrückung der Schleife stimmt im Beispiel nicht.

Verfasst: Montag 21. April 2008, 13:18
von TheGrudge
ja gut die Einrückung ist wurscht, da habe ich komisch gepasted. Also gibt es diese Notation doch?

Verfasst: Montag 21. April 2008, 13:22
von Trundle
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.

Verfasst: Montag 21. April 2008, 13:23
von TheGrudge
Aber irgendwie kann ich es ja so nicht in ipython verwenden, muss ich dann noch numpy oder so einbinden?

Verfasst: Montag 21. April 2008, 13:54
von CM
Von was ist denn "toprow" eine Instanz? Welchen Typ hat es?

Verfasst: Montag 21. April 2008, 14:01
von TheGrudge
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...

Verfasst: Montag 21. April 2008, 15:09
von EyDu
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))

Verfasst: Montag 21. April 2008, 20:24
von Sr4l
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?

Verfasst: Montag 21. April 2008, 20:29
von TheGrudge
Ja ich verstehe das auch nicht... Ui Eschwege... meine Verwandten wohnen dort... naja fast, in Eltmannshausen... nur mal so am Rande :)

Verfasst: Montag 21. April 2008, 20:33
von audax

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)

Verfasst: Montag 21. April 2008, 20:40
von Sr4l
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.

Verfasst: Montag 21. April 2008, 20:53
von audax
Du willst doch nicht auf ein dict immer mit foo.get('bar') zugreifen, ebenso nicht auf Arrays, oder?

Verfasst: Montag 21. April 2008, 21:14
von Sr4l
es ging mir speziel um :,:
Die Zeichen haben mich einfach verwirrt ich habe zwanghaft eine Bedeutung in dieser Kombination gesucht.

Verfasst: Montag 21. April 2008, 21:17
von Leonidas
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.

Verfasst: Dienstag 22. April 2008, 07:57
von birkenfeld
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.