Transferir a propriedade de dados numulados
No meupergunta anterior, Aprendi a redimensionar uma subclassendarray
no lugar. Arrumado. Infelizmente, isso não funciona mais quando a matriz que estou tentando redimensionar é o resultado de uma computação:
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)
A saída exata (incluindo traceback) é:
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
Acho que isso é porquenumpy
cria um novondarray
e passa para__array_prepare__
. Em algum momento ao longo do caminho, parece que o "output
"matriz ficavista-casted ao meuFoo
tipo, embora os documentos não pareçam 100% claros / precisos neste ponto. De qualquer forma, após a exibição, a saída não é mais proprietária dos dados, tornando impossível reformulá-la (até onde eu saiba).
Existe alguma maneira, através de algum voodoo numpy (__array_prepare__
, __array__
) etc. para transferir a propriedade dos dados para a instância da minha subclasse?