不可变的numpy数组?
Posted
技术标签:
【中文标题】不可变的numpy数组?【英文标题】:Immutable numpy array? 【发布时间】:2011-07-29 07:39:20 【问题描述】:有没有创建不可变 NumPy 数组的简单方法?
如果必须从 ndarray
派生一个类来执行此操作,那么为了实现不变性必须重写的最少方法集是多少?
【问题讨论】:
为什么需要不变性? @KennyTM 避免因意外修改假定不变的内容而导致的编码错误。 【参考方案1】:你可以让一个 numpy 数组不可写:
a = np.arange(10)
a.flags.writeable = False
a[0] = 1
# Gives: ValueError: assignment destination is read-only
另请参阅此线程中的讨论:
http://mail.scipy.org/pipermail/numpy-discussion/2008-December/039274.html
和文档:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.flags.html
【讨论】:
或者,a.setflags(write=False)
。
@lafrasu 您认为哪个是首选形式,setflags()
或 flags.writeable=
?
@aix:快速浏览一下文档会让人觉得这两种方法是相同的。就个人而言,我更喜欢使用方法来设置属性。
这是否也使它可以记忆?
重要!! Numpy 没有不可变数组。带有.flags.writeable = False
的数组仍然不是不可变的。如果x
是一个数组,则y = x[:]; x.flags.writeable = False; y[0] = 5
将x
的第一个元素更新为5
。【参考方案2】:
在这个要点上我有一个 Array 的子类:https://gist.github.com/sfaleron/9791418d7023a9985bb803170c5d93d8
它会复制它的论点并将其标记为只读,所以如果你非常慎重,你应该只能在脚上开枪。我迫切需要它是可散列的,所以我可以成组使用它们,这样也可以。代码不多,但是大概70%的行都是测试用的,就不直接贴了。
请注意,它不是直接替换;它不会像普通的 Array 构造函数那样接受任何关键字参数。不过,实例的行为类似于数组。
【讨论】:
【参考方案3】:直接设置标志对我不起作用,但使用 ndarray.setflags
确实有效:
a = np.arange(10)
a.setflags(write=False)
a[0] = 1 # ValueError
【讨论】:
以上是关于不可变的numpy数组?的主要内容,如果未能解决你的问题,请参考以下文章
包含具有可变形状的多维 numpy 数组的 numpy 数组