Jeg forsøker å implementere en egen klasse som inneholder en numpy array med litt ekstra. Denne skal oppføre seg som om man behandlet arrayet den inneholder direkte, men ha noe ekstra funksjonalitet. Av forskjellige grunner virker ikke det å arve ndarray som en god løsning.
I utgangspunktet fungerer dette fint, med unntak av en ting. For jeg skulle gjerne kunne bruke dette objektet som argument til numpy.empty_like(), slik at det nye arrayet ble av samme størrelse og datatype som arrayet i min egen klasse.
Her er et minimalistisk eksempel:
Den faktiske implementasjonen inneholder noen ekstra funksjoner og ekstra data som gjør arv mindre egnet, men det viser poenget. Jeg kan instansiere og bruke denne på samme måte som arrayet direkte. Men dersom jeg forsøker med følgende:
... ender, ikke overraskende, new_array opp som et nulldimensjonalt array med datatype object. Jeg har prøvd å definere både "__len__(self)" og variabelen "shape", slik at både len() og numpy sin shape-funksjon fungerer, men resultatet er det samme. Et alternativ er å skrive "empty_like(my_obj.my_array)", men det vil være lite elegant.
Er det noen interne funksjoner eller variabler som kan defineres slik at størrelse og datatype blir korrekt når man bruker denne som utgangspunkt til empty_like, zeros_like osv? Eller er det rett og slett umulig?
I utgangspunktet fungerer dette fint, med unntak av en ting. For jeg skulle gjerne kunne bruke dette objektet som argument til numpy.empty_like(), slik at det nye arrayet ble av samme størrelse og datatype som arrayet i min egen klasse.
Her er et minimalistisk eksempel:
Kode
class My_class: def __init__(self, size): self.my_array = numpy.zeros(size, dtype=numpy.int) def __getitem__(self, val): return self.my_array[val]
Kode
my_obj = My_class((10,10)) new_array = numpy.empty_like(my_obj)
Er det noen interne funksjoner eller variabler som kan defineres slik at størrelse og datatype blir korrekt når man bruker denne som utgangspunkt til empty_like, zeros_like osv? Eller er det rett og slett umulig?