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

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

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

【问题讨论】:

  • 为什么需要不变性?
  • @KennyTM 避免因意外修改假定不变的内容而导致的编码错误。

标签: python arrays numpy immutability readonly


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-06-26
      • 2022-01-20
      • 2018-06-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多