不可变的 numpy 数组?
有没有简单的方法可以创建一个不可变的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