Transferencia de propiedad de los datos numpy
En miPregunta anterior, Aprendí a redimensionar un subclasificadondarray
en su lugar. Ordenado. Desafortunadamente, eso ya no funciona cuando la matriz que estoy intentando cambiar de tamaño es el resultado de un cálculo:
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)
El resultado exacto (incluido el rastreo) es:
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
Creo que esto es porquenumpy
crea un nuevondarray
y se lo pasa a__array_prepare__
. En algún punto del camino, sin embargo, parece que el "output
"matriz obtienevista a miFoo
tipo, aunque los documentos no parecen ser 100% claros / precisos en este punto. En cualquier caso, después de la conversión de la vista, la salida ya no posee los datos, por lo que es imposible remodelarlos en el lugar (por lo que puedo decir).
¿Hay alguna manera, a través de algún tipo de vudú entumecido (__array_prepare__
, __array__
) etc. para transferir la propiedad de los datos a la instancia de mi subclase?