如何在Python中验证复制是否已完成?

3
在Python 3.x中,我正在使用大型的numpy数组。我希望能够确认(无需实际进行某种实验),我编写的方法是使用数组的副本还是直接引用数组。
我也想确认所涉及的数组是否已被修改。
在C++中,如果我想确保对象未被修改,我可以将其作为const传递...在Python中,我似乎没有这样的保证,必须特别小心。
因此,总结一下:我需要一种方法来告诉我numpy数组是否已产生副本。我需要一种方法来告诉我数组(或任何其他对象)是否已被修改。我更喜欢快速,自动化的方法,而不是进行实验。

2
无论是(天真的).base的使用还是.flags['OWNDATA']都可能导致错误的结论。根据NumPy开发人员Robert Kern的说法,目前最好的方法是np.may_share_memory - unutbu
1个回答

8
你可以使用 np.ndarray.flags 来进行操作:
>>> a = np.arange(5)
>>> a.flags
  C_CONTIGUOUS : True
  F_CONTIGUOUS : True
  OWNDATA : True
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False

例如,您可以使用 np.setflags 将数组设置为不可写;在这种情况下,尝试修改数组将失败:
>>> a.setflags(write=False)  # sets the WRITEABLE flag to False
>>> a[2] = 10                # the modification will fail
ValueError: assignment destination is read-only

另一个有用的标志是OWNDATA,例如可以指示数组实际上是另一个数组的视图,因此不拥有其数据:

>>> a = np.arange(5)
>>> b = a[::2]
>>> a.flags['OWNDATA']
True
>>> b.flags['OWNDATA']
False

1
我之前不知道这是可能的。这真的非常有用。 - TheBlackCat
@behzad.nouri 很高兴知道这个,非常感谢!我想知道 Python 数组类型,例如列表等是否有这样的功能?那也会非常有用。 - Trekkie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接