python - Numpy 数组和 python 属性

标签 python properties numpy

我想在每次设置时检查 numpy 数组的内容。 python属性可以用于此吗?我的做法:

import numpy as np

class Obj(): 
    def __init__(self):                                                                                 
        self._np_arr = None                                                                             

    @property                                                                                           
    def np_arr(self):                                                                                   
        if self._np_arr is None:                                                                        
            self._np_arr = np.ones(10)                                                                  
        return self._np_arr                                                                             

    @np_arr.setter
    def np_arr(self, value):
        if np.sum(value)>10:
            raise ValueError('Error message')                                                           
        self._np_arr = value

if __name__ == '__main__':
    o = Obj()                                                                                           
    print o.np_arr
    o.np_arr = np.zeros(10) # ok                                                                        
    o.np_arr = np.ones(10)*2 # not ok                                                                   
    print o.np_arr       

getter在对象还是None的时候进入。一旦 np_arr 是一个 numpy 数组,getter 和 setter 就不再起作用。

我做错了什么?

最佳答案

首先。这很难(直到,我相信不可能)做对。这里的错误很简单,肯定是新建了一个样式类。所以只需将 class Obj() 替换为 class Obj(object)

但这可能无法解决您的问题,因为用户仍然可以就地分配它,即:

o.np_arr[:] = 2

您可以通过使用 _np_arr.setflags(write=False) 稍微规避一下,但是用户根本无法使用此类操作。

编辑: 您还可以将 ndarray 子类化,并定义您自己的 __array_finalize__ 来规避这种情况。然而,即使那样,用户也可以执行 np.asarray(o.np_arr) 并就地修改它...

我想您可以提供自己的方法,然后通过在可写数组上进行内部操作来“模拟”一个数组。但我怀疑是否存在 100% 万无一失或至少是优雅的方法。

关于python - Numpy 数组和 python 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12491834/

相关文章:

python - 从 sklearn 的 MLPClassifier 中检索最终的隐藏激活层输出

python - Google 数据源 JSON 无效吗?

java - 我如何找出 ResourceBundle 的来源?

python - 以图形形式表示python字典

python - numpy数组索引中的隐式转置

python - Xen客户端系统下的NumPy

python - pandas 中的数据框子

python - access(2) vs stat(2) 检查文件是否可执行

swift - 为什么在更改现有值的成员时会运行属性观察器?

C# 基本类型(double、int 等)和 Struct 差异