【发布时间】:2011-07-29 07:39:20
【问题描述】:
有没有创建不可变 NumPy 数组的简单方法?
如果必须从 ndarray 派生一个类来执行此操作,那么为了实现不变性必须重写的最少方法集是多少?
【问题讨论】:
-
为什么需要不变性?
-
@KennyTM 避免因意外修改假定不变的内容而导致的编码错误。
标签: python arrays numpy immutability readonly
有没有创建不可变 NumPy 数组的简单方法?
如果必须从 ndarray 派生一个类来执行此操作,那么为了实现不变性必须重写的最少方法集是多少?
【问题讨论】:
标签: python arrays numpy immutability readonly
你可以让一个 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)。
setflags() 或 flags.writeable=?
.flags.writeable = False 的数组仍然不是不可变的。如果x 是一个数组,则y = x[:]; x.flags.writeable = False; y[0] = 5 将x 的第一个元素更新为5。
在这个要点上我有一个 Array 的子类:https://gist.github.com/sfaleron/9791418d7023a9985bb803170c5d93d8
它会复制它的论点并将其标记为只读,所以如果你非常慎重,你应该只能在脚上开枪。我迫切需要它是可散列的,所以我可以成组使用它们,这样也可以。代码不多,但是大概70%的行都是测试用的,就不直接贴了。
请注意,它不是直接替换;它不会像普通的 Array 构造函数那样接受任何关键字参数。不过,实例的行为类似于数组。
【讨论】:
直接设置标志对我不起作用,但使用 ndarray.setflags 确实有效:
a = np.arange(10)
a.setflags(write=False)
a[0] = 1 # ValueError
【讨论】: