<p>很好的问题,我会尽力回答,不过,我不能百分之百确定这个解决方案是否有副作用。在</p>
<p>必须指定<code>__array_ufunc__</code>方法。通过更改<a href="https://docs.scipy.org/doc/numpy/user/basics.subclassing.html#array-ufunc-for-ufuncs" rel="nofollow noreferrer">https://docs.scipy.org/doc/numpy/user/basics.subclassing.html#array-ufunc-for-ufuncs</a>中的代码,我获得了预期的结果(我相信这些结果是:没有将标量结果包装为MyArray,对吗?)在</p>
<pre><code>class MyArray(np.ndarray):
def __new__(cls, input_array, foo='foo'):
self = input_array.view(cls)
self.foo = foo
return self
def __array_finalize__(self, from_array):
if from_array is not None:
self.foo = getattr(from_array, 'foo', 'foo')
def __array_ufunc__(self, ufunc, method, *inputs, **kwargs):
args = []
in_no = []
for i, input_ in enumerate(inputs):
if isinstance(input_, MyArray):
in_no.append(i)
args.append(input_.view(np.ndarray))
else:
args.append(input_)
outputs = kwargs.pop('out', None)
out_no = []
if outputs:
out_args = []
for j, output in enumerate(outputs):
if isinstance(output, MyArray):
out_no.append(j)
out_args.append(output.view(np.ndarray))
else:
out_args.append(output)
kwargs['out'] = tuple(out_args)
else:
outputs = (None,) * ufunc.nout
results = super(MyArray, self).__array_ufunc__(ufunc, method,
*args, **kwargs)
if results is NotImplemented:
return NotImplemented
if method == 'at':
return
if ufunc.nout == 1:
results = (results,)
results = tuple((np.asarray(result).view(MyArray)
if isinstance(result, np.ndarray) else result)
#if output is None else output)
for result, output in zip(results, outputs))
return results[0] if len(results) == 1 else results
</code></pre>
<p>导致:</p>
^{pr2}$