不可变的 numpy 数组?

99 投票
3 回答
46672 浏览
提问于 2025-04-16 15:04

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

如果需要从ndarray这个类派生出一个新类来实现这个功能,那么最少需要重写哪些方法才能做到不可变呢?

3 个回答

0

我有一个数组的子类,具体内容可以在这个链接找到:https://gist.github.com/sfaleron/9791418d7023a9985bb803170c5d93d8

这个子类会复制传入的参数,并把它标记为只读,这样你只有在非常小心的情况下才可能出错。我最开始的需求是希望它可以被哈希化,这样我就可以把它放进集合里,这个功能也实现了。代码不算多,但大约70%的行数是用来测试的,所以我就不直接贴出来了。

需要注意的是,这个子类不能直接替代普通的数组;它不会像普通数组构造函数那样接受任何关键字参数。不过,它的实例会像数组一样工作。

1

直接设置标志对我来说没用,但使用 ndarray.setflags 就有效了:

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

你可以让一个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

撰写回答