2015-11-04 28 views
45

尋找一種方法來可靠地識別numpy對象是否是一個視圖。numpy:可靠(非保守)指標,如果numpy數組是查看

相關問題已經提出了很多次(hereherehere),人們已經提出了一些解決方案,但都似乎有問題:

  • 現在pandas使用的測試是指對某事物一個視圖如果my_array.base is not None。這似乎總是能夠捕捉到意見,但也提供了大量的誤報(即使它不是報告某種情況的視圖)。
  • numpy.may_share_memory()將檢查兩個特定的陣列,但不會回答一般
    • (@RobertKurn說是爲2012年最佳工具 - ?任何更改)
  • flags['OWNDATA'])reported (third comment first answer)在失敗一些案例。

(原因我感興趣的是,我正在執行寫入時複製的大熊貓,以及保守的指標是導致過度複製。)

+4

關於numpy github跟蹤器的相關討論:https://github.com/numpy/numpy/issues/5604 –

+3

描述爲誤報的情況似乎是當「創建副本」的操作實際上返回複印件。如果這被認爲是「不是視圖」,你可以嘗試檢查數組「base」的refcount以查看是否有其他引用,但這不會是完美的。我不認爲有可能可靠地檢測到這種事情。 – user2357112

+6

也看到這個最近的SO問題,http://stackoverflow.com/questions/33467477/how-to-find-all-variables-with-identical-id。它提到了一個新的函數'np.shares_memory'。但是我在那裏指出,比較兩個已知變量是一回事,要問的另一個問題是數組與其他數組共享數據緩衝區。 – hpaulj

回答

1

根據您的用途,flags['OWNDATA']會做這項工作。實際上,你的鏈接沒有問題。 它在某些情況下不會失敗。它會一直做它應該做的事情。

根據http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.require.html:標誌「確保擁有自己的數據的數組」。

在你的「反例」,他們使用代碼:

print (b.flags['OWNDATA']) #False -- apparently this is a view 
e = np.ravel(b[:, 2]) 
print (e.flags['OWNDATA']) #True -- Apparently this is a new numpy object. 

但是,這是正常的行爲是真正在第二種情況下。

它來自ravel(從http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ravel.html)的定義。

返回一個連續的扁平數組。 返回包含輸入元素的1-D數組。只有在需要時才進行復制。

在這裏,需要一個副本,所以複製。所以,變量e真的擁有自己的數據。它不是「b的視圖」,「對b的引用」,「對b的一部分的別名」。這是一個真正的新數組,其中包含b的一些元素的副本。

所以,我認爲這是不可能的,沒有跟蹤數據的整個來源來檢測這種行爲。我相信你應該可以用這個標誌來建立你的程序。