Übertragen Sie das Eigentum an numpy Daten

In meinemvorherige FrageIch habe gelernt, die Größe einer Unterklasse zu ändernndarray an Ort und Stelle. Ordentlich. Leider funktioniert das nicht mehr, wenn das Array, dessen Größe ich ändern möchte, das Ergebnis einer Berechnung ist:

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)

Die genaue Ausgabe (einschließlich Traceback) lautet:

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

Ich denke das liegt darannumpy schafft eine neuendarray und übergibt es an__array_prepare__. Irgendwann auf dem Weg scheint es, dass die "output"Array wirdauf meineFoo Art, obwohl die Dokumente in diesem Punkt nicht 100% klar / genau zu sein scheinen. In jedem Fall besitzt die Ausgabe nach dem Casting der Ansicht nicht mehr die Daten, sodass es unmöglich ist, sie an Ort und Stelle umzugestalten (soweit ich das beurteilen kann).

Gibt es eine Möglichkeit, über eine Art numpy Voodoo (__array_prepare__, __array__) usw., um das Eigentum an den Daten auf die Instanz meiner Unterklasse zu übertragen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage