在我之前的问题中,我学会了调整子类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
type,尽管在这一点上文档似乎不是 100% 清晰/准确。无论如何,在视图转换之后,输出不再拥有数据,因此无法就地重塑(据我所知)。
有没有办法通过某种 numpy voodoo ( __array_prepare__
, __array__
) 等将数据的所有权转移到我的子类的实例?