Seite 1 von 1

Wie kann wurde NumPy's Array Slicing implementiert?

Verfasst: Mittwoch 30. April 2008, 12:01
von phxx
Hallo zusammen.

Ich habe mir gerade ein NumPy Tutorial durchgelesen und bin dabei auf folgendes Code-Fragment gestoßen:

Code: Alles auswählen

>>> c = array( [ [[  0,  1,  2],               # a 3d array (two stacked 2d arrays)
...               [ 10, 12, 13]],
...
...              [[100,101,102],
...               [110,112,113]] ] )
>>> c.shape
(2, 2, 3)
>>> c[1,...]                                   # same as c[1,:,:] or c[1]
array([[100, 101, 102],
       [110, 112, 113]])
>>> c[...,2]                                   # same as c[:,:,2]
array([[  2,  13],
       [102, 113]])
Dabei interessiert mich am meisten wie man zB c[1,...] implementieren kann. Das man wie oben auch z.B. Tuples als Sliceelement verwenden kann ist mir bekannt. Aber sind die drei dots nicht ein syntaktischer Fehler?

phxx

Verfasst: Mittwoch 30. April 2008, 12:23
von BlackJack
Nein drei Punkte beim Indexoperator sind kein Syntaxfehler:

Code: Alles auswählen

In [32]: class A(object):
   ....:     def __getitem__(self, arg):
   ....:         print repr(arg)
   ....:         print type(arg)
   ....:

In [33]: a = A()

In [34]: a[...]
Ellipsis
<type 'ellipsis'>
IMHO ein ziemlich ekliger Sonderfall, den ich ausser bei Numpy und seinen Vorgängern auch noch nie in der Praxis gesehen habe.

Verfasst: Mittwoch 30. April 2008, 13:52
von Leonidas
NumPy stellt generell lustige Sachen mit den Slicing an, da war auch erst letztens ein Thread mit Kommas.

``...`` wird aber ab Python 3.0 gültiger Code.

Verfasst: Mittwoch 30. April 2008, 14:41
von phxx
Ah, ok.
Danke. Jetzt weiß ich bescheid :-)

Kollidiert ... dann in Python 3.0 nicht mit den Imports? Weil es ist ja zB möglich mit

Code: Alles auswählen

from ... import package
ein Package aus zwei Ordnern über dem aktuellen File zu importieren.

Verfasst: Mittwoch 30. April 2008, 16:33
von Leonidas
Der Parser wird dann schon schlau genug sein, zu merken, wo was sinnvoll ist, keine Sorge.