如何验证何时在Python中创建副本?

时间:2015-04-02 11:22:46

标签: python arrays python-3.x numpy

在Python 3.x中,我正在使用大型numpy数组。我想确认(无需实际进行某种实验)我编写的方法要么使用数组的副本,要么正在使用对数组的直接引用。

我还想确认有问题的数组是否已被修改过。

在C ++中,如果我想确保一个对象没有被修改,我可以将它作为一个const ...在Python中传递,我似乎没有这样的保证,必须要格外小心。

所以,总结一下:我需要一种方法来判断一个副本是否已经产生了numpy数组。我需要一种方法来判断数组(或任何对象)是否已被修改。我宁愿采用快速,自动的方式而不必进行实验。

1 个答案:

答案 0 :(得分: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