在Python 3.x中,我正在使用大型numpy数组。我想确认(无需实际进行某种实验)我编写的方法要么使用数组的副本,要么正在使用对数组的直接引用。
我还想确认有问题的数组是否已被修改过。
在C ++中,如果我想确保一个对象没有被修改,我可以将它作为一个const ...在Python中传递,我似乎没有这样的保证,必须要格外小心。
所以,总结一下:我需要一种方法来判断一个副本是否已经产生了numpy数组。我需要一种方法来判断数组(或任何对象)是否已被修改。我宁愿采用快速,自动的方式而不必进行实验。
答案 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