ndarray auf einzelne Werte zu greifen

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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@EyDu
Das sieht doch nochmal um längen schicker aus. Könnte man die lambda-Funktion nicht noch durch list.__getitem__ ersetzen?

Obwohl ich Wörterbücher nicht damit mischen würde, hättest du natürlich recht, daran und slices habe ich nicht gedacht und vergess jetzt bloß nicht "Ellipsis" noch mit einzubauen :D

Aber wie gestaltet man damit das setzen des anderen Liste/Arrays?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@Xynon1: Dann funktioniert es ja nur mit Listen. Für's setzen müsste man sich eine Funktion schreiben die sich auf die vorhandene Abstützt.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Stimmt, und ich nehme mal an das "type(data).__getitem__" auch nicht angebracht ist, weil es im Vergleich zu der lambda-Funktion etwas unschöner ausieht.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Dann also so?

Code: Alles auswählen

class Lizzy(list):

    def __getitem__(self, index):
        if isinstance(index, (int, slice)):
            return list.__getitem__(self, index)
        else:
            return reduce(list.__getitem__, index, self)

    def __setitem__(self, index, item):
        if isinstance(index, (int, slice)):
            list.__setitem__(self, index, item)
        else:
            list.__setitem__(self[index[:-1]], index[-1], item)


li = Lizzy([['a', 'b', 'c'], ['d', 'e', 'f']])

print li[1]
print li[1,1]
print li[slice(1,3)]
print li[1, slice(1,3)]
li[0,2] = li[1,1]
print li
li[0, slice(0,3)] = li[1, slice(0,2)]
print li
Ergebnis:

Code: Alles auswählen

['d', 'e', 'f']
e
[['d', 'e', 'f']]
['e', 'f']
[['a', 'b', 'e'], ['d', 'e', 'f']]
[['d', 'e'], ['d', 'e', 'f']]
In specifications, Murphy's Law supersedes Ohm's.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Verhält sich aber irgendwie anders als ich erwarten würde:

Code: Alles auswählen

>>> li = Lizzy([['a', 'b', 'c'], ['d', 'e', 'f']])
>>> la = numpy.array(li)
>>> la
array([['a', 'b', 'c'],
       ['d', 'e', 'f']], 
      dtype='<U1')
>>> li
[['a', 'b', 'c'], ['d', 'e', 'f']]
>>> la[slice(0, 2), 0]
array(['a', 'd'], 
      dtype='<U1')
>>> li[slice(0, 2), 0]
['a', 'b', 'c']
>>> 
Mit den Slice-Ausdrücken kommt es so nicht klar, war zwar auch nicht die Bedingung, aber man würde halt was anderes erwarten.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten