我想深入瞭解numpy數組;特別是內存佈局/所有權/共享相關方面。在那個努力中,我偶然發現了聽起來很有趣的UPDATEIFCOPY標誌。 只有我從沒見過它。 用戶只能unset它。如果你喜歡它,安靜地搜索「UPDATEIFCOPY True」會非常輕鬆。是否爲UPDATEIFCOPY標誌?
那麼如何創建一個數組,其標誌設置爲True?
我想深入瞭解numpy數組;特別是內存佈局/所有權/共享相關方面。在那個努力中,我偶然發現了聽起來很有趣的UPDATEIFCOPY標誌。 只有我從沒見過它。 用戶只能unset它。如果你喜歡它,安靜地搜索「UPDATEIFCOPY True」會非常輕鬆。是否爲UPDATEIFCOPY標誌?
那麼如何創建一個數組,其標誌設置爲True?
您可以設置當您使用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 # <--- :-(
技術上,這回答我的問題,所以我接受它。我想兩個答案都可以一起解決,一旦我的大腦停止旋轉,我可能會解決這個問題。 –
UPDATEIFCOPY標誌永遠不能設置爲True。
UPDATE
如果數組不擁有其自己的存儲器,則該基本屬性返回其內存這個陣列被引用對象。
返回的對象可能不是內存的原始分配器,但可能是從另一個對象借用它。如果此數組擁有自己的內存,則除非UPDATEIFCOPY標誌爲True,否則返回None,在這種情況下,self.base是刪除self時將更新的數組。
UPDATEIFCOPY會自動設置爲創建爲常規數組的行爲副本的數組。目的是讓未對齊的數組獲得副本發生的任何更改。
你這樣做的目的不是嗎?我認爲它要求一個人可讀的版本是不可能的?無論如何,在這裏,有一個upvote爲您的麻煩;-) –
我想我不能讓它更容易,英語不是我的主要語言,所以它會很困難:) – Svekke
我認爲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
@ user7138814經過這麼長時間的一個連貫的答案。非常感謝,確實!所以就這麼簡單。但是,MSeifert爲他的答案挖出了那個例子呢? –
我想當你將'updateifcopy''標誌傳遞給'nditer'時,你應該知道你在做什麼;-)示例中的前兩行創建一個未對齊的數組,而'nditer'命令對齊的陣列。所以它按預期工作。 – user7138814