2017-01-31 27 views
2

我想深入瞭解numpy數組;特別是內存佈局/所有權/共享相關方面。在那個努力中,我偶然發現了聽起來很有趣的UPDATEIFCOPY標誌。 只有我從沒見過它。 用戶只能unset它。如果你喜歡它,安靜地搜索「UPDATEIFCOPY True」會非常輕鬆。是否爲UPDATEIFCOPY標誌?

那麼如何創建一個數組,其標誌設置爲True?

+0

我認爲UPDATEIFCOPY機制應該只在內部使用。所以在numpy源代碼或C擴展中。在Python端擁有這樣一個數組對用戶來說是非常不友好的。 numpy中的一個重要用例似乎是處理錯位,錯誤數據類型的'out'參數,或者不處理C-contiguous [code-explanations.rst](https://github.com/numpy/numpy/)斑點/ v1.12.0/DOC /源極/參考/ internals.code-explanations.rst)。 – user7138814

+0

@ user7138814經過這麼長時間的一個連貫的答案。非常感謝,確實!所以就這麼簡單。但是,MSeifert爲他的答案挖出了那個例子呢? –

+0

我想當你將'updateifcopy''標誌傳遞給'nditer'時,你應該知道你在做什麼;-)示例中的前兩行創建一個未對齊的數組,而'nditer'命令對齊的陣列。所以它按預期工作。 – user7138814

回答

2

您可以設置當您使用np.nditer(從NumPy source code採取爲例):

>>> import numpy as np 
>>> a = np.zeros((6*4+1,), dtype='i1')[1:] 
>>> a.dtype = 'f4' 
>>> a[:] = np.arange(6, dtype='f4') 
>>> i = np.nditer(a, [], [['readwrite', 'updateifcopy', 'aligned']]) 
>>> print(i.operands[0].flags) 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : True 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : True  # <--- :-) 

但是我不知道在什麼情況下,這是真正的設置,因爲如果我刪除了前兩行,然後它不不再工作:

>>> import numpy as np 

>>> a = np.arange(6, dtype='f4') 
>>> i = np.nditer(a, [], [['readwrite', 'updateifcopy', 'aligned']]) 
>>> print(i.operands[0].flags) 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : True 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False  # <--- :-(
+0

技術上,這回答我的問題,所以我接受它。我想兩個答案都可以一起解決,一旦我的大腦停止旋轉,我可能會解決這個問題。 –

1

UPDATEIFCOPY標誌永遠不能設置爲True。

UPDATE

如果數組不擁有其自己的存儲器,則該基本屬性返回其內存這個陣列被引用對象。

返回的對象可能不是內存的原始分配器,但可能是從另一個對象借用它。如果此數組擁有自己的內存,則除非UPDATEIFCOPY標誌爲True,否則返回None,在這種情況下,self.base是刪除self時將更新的數組。

UPDATEIFCOPY會自動設置爲創建爲常規數組的行爲副本的數組。目的是讓未對齊的數組獲得副本發生的任何更改。

+0

你這樣做的目的不是嗎?我認爲它要求一個人可讀的版本是不可能的?無論如何,在這裏,有一個upvote爲您的麻煩;-) –

+0

我想我不能讓它更容易,英語不是我的主要語言,所以它會很困難:) – Svekke

相關問題