2015-08-26 46 views
3

我有一個關於numpy的問題,它是內存。是否有可能生成一個視圖或多個numpy數組之外的東西而不復制它們?無法複製的數組的Numpy矩陣可能嗎?

import numpy as np 


    def test_var_args(*inputData): 
     dataArray = np.array(inputData) 
     print np.may_share_memory(inputData, dataArray) # prints false, b.c. of no shared memory 

    test_var_args(np.arange(32),np.arange(32)*2) 

我有一個C++應用程序與圖像,並希望做一些python魔術。我使用c-api將行中的圖像傳遞給python腳本,並希望將它們組合起來而不復制它們。

我能夠通過數據s.t. C++和python共享相同的內存。現在我想將內存分配給一個numpy視圖/數組或類似的東西。

C++中的圖像不會持續存在於內存中(我對它們進行切片)。我交給python的行被安排在連續的內存塊中。

我通過的圖像數量是不同的。如果存在預分配技巧,也許我可以改變它。

+0

您可以使用'list'容器來存儲對每個原始數組的引用而不創建副本 –

+1

如果我使用列表,我無法完成所有我想要做的numpy工作。如果我將一個列表轉換爲一個numpy數組,新的內存將被分配。 – Lks

+1

'numpy.array'有一個標誌'複製'。它默認設置爲「True」,因此總是複製您的數據。你有沒有嘗試過使用'np.array(inputData,copy = False)'? – Dux

回答

0

有一個在這裏的回答了有益的探討:Can memmap pandas series. What about a dataframe?

簡而言之:

  • 如果從矩陣的一個數組初始化數據幀,那麼它可能無法複製數據。
  • 如果您從多個相同或不同類型的數組進行初始化,您的數據將被複制。

這是Pandas的DataFrame所使用的默認BlockManager所允許的唯一行爲,它在內部組織DataFrame的內存。

儘管可能會改變這種行爲,但在這種情況下,您提供的數據將被引用到monkey patch the BlockManager