Python 有没有办法防止修改ndarray子类的内容?

Python 有没有办法防止修改ndarray子类的内容?,python,numpy,subclass,numpy-ndarray,Python,Numpy,Subclass,Numpy Ndarray,我正在为计算几何创建各种类,这些类都是numpy.ndarray的子类。DataCloud类是这些类中的典型类,它具有Python属性(例如,凸包、delaunay变换),要多次计算会非常耗时和浪费时间。我只想计算一次。而且,及时,因为对于给定的实例,我可能根本不需要给定的属性。通过在构造函数中设置self.\uuuu凸包=None,并在调用凸包属性时,执行所需的计算,设置self.\uu凸包,并返回计算值,可以很容易地设置此属性 问题是,一旦调用了这些复杂属性中的任何一个,各种numpy(与D

我正在为计算几何创建各种类,这些类都是numpy.ndarray的子类。DataCloud类是这些类中的典型类,它具有Python属性(例如,凸包、delaunay变换),要多次计算会非常耗时和浪费时间。我只想计算一次。而且,及时,因为对于给定的实例,我可能根本不需要给定的属性。通过在构造函数中设置self.\uuuu凸包=None,并在调用凸包属性时,执行所需的计算,设置self.\uu凸包,并返回计算值,可以很容易地设置此属性

问题是,一旦调用了这些复杂属性中的任何一个,各种numpy(与DataCloud子类相反)方法对我的子类外部的内容所做的任何更改都将使所有计算出的属性无效,我对此一无所知。例如,假设外部代码对实例执行此操作:datacloud[3,8]=5。那么,有没有办法(1)在计算完这些属性后使ndarray基类只读,或者(2)让ndarray设置一些指示器,表明其内容发生了更改(就我而言,这会使其变脏),因此,调用任何复杂属性都需要重新计算?

看起来答案是:
np.ndarray.setflags(write=False)

您考虑过只使用组合吗?我最初用组合编码我的类。ndarray是每个类的一个属性。但是,当我开始在我的类的实例之间执行各种操作(例如,和、行列式、矩阵或向量的点积、细分、凸包)时,与使用ndarray实例相比,合成变得很尴尬。广播也很方便。这些是使用ndarray、Numpy和SciPy执行得很好的操作类型。在这一点上,破译如何将ndarray子类化似乎是值得的,我更喜欢这种方法。这个问题一定很常见!