Передать право собственности на данные
В моемпредыдущий вопросЯ научился изменять размер подклассаndarray
на месте. Ухоженная. К сожалению, это больше не работает, когда массив, который я пытаюсь изменить размер, является результатом вычисления:
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)
,Точный вывод (включая трассировку):
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
Я думаю это потому чтоnumpy
создает новыйndarray
и передает его__array_prepare__
, В какой-то момент на этом пути кажется, чтоoutput
"массив получаетна мой взглядFoo
тип, хотя документы не кажутся на 100% ясными / точными по этому вопросу. В любом случае, после преобразования представления выходные данные больше не владеют данными, что делает невозможным изменение формы на месте (насколько я могу судить).
Есть ли способ, через какой-то нудистский вуду (__array_prepare__
, __array__
) и т. д. передать право собственности на данные экземпляру моего подкласса?