Przenieś własność danych numpy
W moimpoprzednie pytanie, Nauczyłem się zmieniać rozmiar podkategoriindarray
w miejscu. Schludny. Niestety, to już nie działa, gdy tablica, której próbuję zmienić rozmiar, jest wynikiem obliczeń:
import numpy as np
class Foo(np.ndarray):
def __new__(cls,shape,dtype=np.float32,buffer=None,offset=0,
strides=None,order=None):
return np.ndarray.__new__(cls,shape,dtype,buffer,offset,strides,order)
def __array_prepare__(self,output,context):
print output.flags['OWNDATA'],"PREPARE",type(output)
return np.ndarray.__array_prepare__(self,output,context)
def __array_wrap__(self,output,context=None):
print output.flags['OWNDATA'],"WRAP",type(output)
return np.ndarray.__array_wrap__(self,output,context)
a = Foo((32,))
#resizing a is no problem
a.resize((24,),refcheck=False)
b = Foo((32,))
c = Foo((32,))
d = b+c
#Cannot resize `d`
d.resize((24,),refcheck=False)
Dokładne dane wyjściowe (w tym traceback) to:
True PREPARE <type 'numpy.ndarray'>
False WRAP <class '__main__.Foo'>
Traceback (most recent call last):
File "test.py", line 26, in <module>
d.resize((24,),refcheck=False)
ValueError: cannot resize this array: it does not own its data
Myślę, że tak jestnumpy
tworzy nowyndarray
i przekazuje to__array_prepare__
. W pewnym momencie jednak wydaje się, że „output
„dostaje tablicęrzucony na mójFoo
rodzaj, chociaż dokumenty nie wydają się być w tym punkcie w 100% jasne / dokładne. W każdym razie po rzuceniu widoku wyjście nie jest już właścicielem danych, co uniemożliwia zmianę kształtu (o ile wiem).
Czy jest jakiś sposób, za pośrednictwem jakiegoś dziwnego voodoo (__array_prepare__
, __array__
) itd., aby przenieść własność danych do instancji mojej podklasy?