2015-04-02 35 views
3

在Python 3.x中,我正在处理大型的numpy数组。我希望得到确认(不必实际做某种实验)我写的方法要么使用数组的副本,要么使用对数组的直接引用。如何验证在Python中创建副本的时间?

我还想确认有问题的数组是否已被修改。在C++中,如果我想确保一个对象没有被修改,我可以把它作为一个const来传递......在Python中,我似乎没有这样的保证,必须格外小心。

因此,总结一下:我需要一种方法来判断副本是否已经生成了一个numpy数组。我需要一种方法来判断一个数组(或任何对象)是否已被修改。我更喜欢快速,自动的方式,而不是做一个实验。

+2

两个[(幼稚使用)'.base'](http://stackoverflow.com/questions/11286864/is-there-a-way-to-check-if-numpy-arrays-share -the-same-data#comment14852955_11286976)和['.flags ['OWNDATA']'](http://stackoverflow.com/q/28886731/190597)可能会导致错误的结论。 [根据NumPy开发者Robert Kern](http://stackoverflow.com/a/10752605/190597),我们目前最好的是'np.may_share_memory'。 – unutbu 2015-04-02 12:39:58

回答

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 2015-04-02 11:33:43

+0

@ behzad.nouri很高兴知道,非常感谢!我想知道Python数组类型,例如列表等有这样的功能?这也会非常有用。 – 2015-04-02 12:55:40