前の質問で、サブクラス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__
)などを介して、データの所有権をサブクラスのインスタンスに譲渡する方法はありますか?