kiy*_*iyo 7 python numpy scipy
我有一个数组子类,其中一些额外的属性仅对对象的原始形状有效.有没有办法确保所有数组形状更改操作返回一个普通的numpy数组而不是我的类的实例?
我已经写array_wrap,但是这似乎并不具有像操作的任何影响np.mean,np.sum或np.rollaxis.这些只是返回我班级的一个实例.
import numpy as np
class NewArrayClass(np.ndarray):
__array_priority__ = 3.0
def __array_wrap__(self, out_arr, context=None):
if out_arr.shape == self.shape:
out = out_arr.view(new_array)
# Do a bunch of class dependant initialization and attribute copying.
# ...
return out
else:
return np.asarray(out_arr)
A = np.arange(10)
A.shape = (5, 2)
A = arr.view(NewArrayClass)
# Would like this to be np.ndarray, but get new_array_class.
print type(np.sum(A, 0))
Run Code Online (Sandbox Code Playgroud)
我想我必须做的东西__new__还是__array_finalize__,但我还没有什么线索.
更新:
仔细阅读子类化的numpy文档(http://docs.scipy.org/doc/numpy/user/basics.subclassing.html)后,所有数组形状更改操作都在执行"从模板新建"操作.所以问题就变成了,如何使'new from template'操作返回ndarray实例而不是我的类的实例.据我所知,__new__在这些功能中永远不会被调用.
替代方案:
假设上述情况不可能,我如何至少在__array_finalize__新模板操作中识别(与视图转换相反)?这至少可以让我取消引用一些通过引用复制的属性.我还可以设置一个标志或告诉新实例其形状无效的东西.
小智 1
如果您不向NewArrayClass实例引入任何新成员,则可以重新分配__class__返回实例的属性。
A.__class__ = np.ndarray
Run Code Online (Sandbox Code Playgroud)
关键是你为什么要做这样的事情。您是否在其他地方进行严格的类型检查?使用鸭子打字你会做得更多。
| 归档时间: |
|
| 查看次数: |
955 次 |
| 最近记录: |