不可变的numpy数组?

Posted

技术标签:

【中文标题】不可变的numpy数组?【英文标题】:Immutable numpy array? 【发布时间】:2011-07-29 07:39:20 【问题描述】:

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

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

【问题讨论】:

为什么需要不变性? @KennyTM 避免因意外修改假定不变的内容而导致的编码错误。 【参考方案1】:

你可以让一个 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) @lafrasu 您认为哪个是首选形式,setflags()flags.writeable= @aix:快速浏览一下文档会让人觉得这两种方法是相同的。就个人而言,我更喜欢使用方法来设置属性。 这是否也使它可以记忆? 重要!! Numpy 没有不可变数组。带有.flags.writeable = False 的数组仍然不是不可变的。如果x 是一个数组,则y = x[:]; x.flags.writeable = False; y[0] = 5x 的第一个元素更新为5【参考方案2】:

在这个要点上我有一个 Array 的子类:https://gist.github.com/sfaleron/9791418d7023a9985bb803170c5d93d8

它会复制它的论点并将其标记为只读,所以如果你非常慎重,你应该只能在脚上开枪。我迫切需要它是可散列的,所以我可以成组使用它们,这样也可以。代码不多,但是大概70%的行都是测试用的,就不直接贴了。

请注意,它不是直接替换;它不会像普通的 Array 构造函数那样接受任何关键字参数。不过,实例的行为类似于数组。

【讨论】:

【参考方案3】:

直接设置标志对我不起作用,但使用 ndarray.setflags 确实有效:

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

【讨论】:

以上是关于不可变的numpy数组?的主要内容,如果未能解决你的问题,请参考以下文章

包含具有可变形状的多维 numpy 数组的 numpy 数组

为包含可变长度序列的数组的输出标签创建分类 numpy 数组

scala数据结构与可变不可变

不可变数组和可变数组

Scala学习(集合01)

Scala学习(集合01)