2012-07-27 17 views
4

我正在使用多處理模塊來操作numpy數組,並且遇到了一個嘗試我在這裏運行的一些代碼的問題。具體來說,我從一個numpy數組創建一個ctypes數組,然後嘗試將ctypes數組返回到一個numpy數組。這裏是代碼:Python共享內存數組,無屬性get_obj()

shared_arr = multiprocessing.RawArray(_numpy_to_ctypes[array.dtype.type],array.size) 

我不需要任何種類的同步鎖,所以我使用RawArray。 ctypes數據類型是根據輸入數組的dtype從字典中提取的。這是奇妙的工作。

shared_arr = numpy.ctypeslib.as_array(shared_arr.get_obj()) 

在這裏,我得到一個堆棧跟蹤,指出:

AttributeError: 'c_double_Array_16154769' object has no attribute 'get_obj' 

我自己也嘗試從this post以下,但得到相同的錯誤。

def tonumpyarray(shared_arr): 
     return numpy.frombuffer(shared_arr.get_obj()) 

我堅持跑步的Python 2.6,不知道如果是這樣的問題,如果是與共享變量名(我想保持內存使用盡可能低和問題,我儘量不在內存中複製numpy數組和ctypes數組),或者我正在學習python的這個組件。

對此提出建議?

+0

我要補充我真的不想回到一個numpy數組,只是返回一個ctypes數組的視圖,我可以寫出一個numpy數組(如果我正確理解操作的順序)。 – Jzl5325 2012-07-27 18:41:45

回答

6

由於您使用RawArray,它只是從共享內存中分配一個ctypes陣列,沒有包裝的對象,所以你不需要get_obj()方法來獲得被包裝的對象:

>>> shared_arr = multiprocessing.RawArray("d",10) 
>>> t = np.frombuffer(shared_arr, dtype=float) 
>>> t[0] = 2 
>>> shared_arr[0] 
2.0