我想在每次设置时检查 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/