2015-04-02 34 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