不可变的numpy数组?

99

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

如果必须从ndarray派生一个类来实现这一点,那么最少需要重写哪些方法才能实现不可变性?


为什么需要不可变性? - kennytm
54
为避免编码错误,因偶然修改假定为不变的内容而导致。 - NPE
3个回答

147

26
另一种方法是 a.setflags(write=False) - lafras
4
@aix:快速查看文档似乎会让人觉得这两种方法是相同的。就我个人而言,我更喜欢使用一种方法来设置属性。 - lafras
3
这是否也使其可记忆化? - endolith
23
重要提示!NumPy 没有不可变数组。对于 .flags.writeable = False 的数组,它们仍然是可变的。 如果 x 是一个数组,y = x[:];x.flags.writeable = False;y[0] = 5 将会将 x 的第一个元素更新为 5 - James Parker
3
@JamesParker 看起来在切片时,标志位会随着数组一起传递。因此,如果在切片之前将writable标志设置为False,那么上面的y在更新时将失败。 - Damon Maria
显示剩余8条评论

1

直接设置标志对我没有起作用,但使用 ndarray.setflags 却可以:

a = np.arange(10)
a.setflags(write=False)
a[0] = 1  # ValueError

0

我在这个代码片段中有一个Array的子类:https://gist.github.com/sfaleron/9791418d7023a9985bb803170c5d93d8

它会复制其参数并将其标记为只读,因此您只能在非常谨慎的情况下自己给自己惹麻烦。我的直接需求是使其可哈希,以便我可以在集合中使用它们,所以这也可以。它不是很多代码,但大约70%的行用于测试,因此我不会直接发布它。

请注意,它不是一个即插即用的替代品;它不会像普通的Array构造函数一样接受任何关键字参数。但实例的行为与数组相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接