不可变的numpy数组?


79

有没有简单的方法来创建不可变的NumPy数组?

如果必须从中派生一个类ndarray来执行此操作,那么为实现不变性而必须重写的最少方法集是什么?


为什么需要不变性?
kennytm 2011年

36
@KennyTM为避免因意外修改假定不变的内容而导致的编码错误。
NPE

Answers:


119

您可以使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/generation/numpy.ndarray.flags.html


20
或者,a.setflags(write=False)
lafras 2011年

1
@lafrasu这将你说的是优选的形式,setflags()还是flags.writeable=
NPE

3
@aix:快速浏览文档会使两种方法看起来完全一样。就个人而言,我更喜欢使用一种方法来设置属性。
lafras 2011年

3
这是否也使其具有记忆性?
endolith,

8
重要!!Numpy没有固定数组。与.flags.writeable = False的数组仍然不可变。如果x为,y = x[:]; x.flags.writeable = False; y[0] = 5则将的第一个元素更新x5
詹姆斯·帕克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.