我正在使用Python(通過)包裝C庫來運行一系列計算。在運行的不同階段,我想將數據導入Python,特別是數組。從ctypes數組獲取數據到numpy
我使用的包裝做了兩種不同類型的返回數組數據(這是特別感興趣的是我)的:
陣列:當我做
type(x)
(其中x是數組,我得到的回報一個<class 'module_name.wrapper_class_name.c_double_Array_12000'>
我知道這個數據是從文檔內部數據的副本,我能夠把它變成一個numpy
陣列容易:>>> np.ctypeslib.as_array(x)
這將返回一個1D numpy
數組數組。
ctype
指針數據:在這種情況下,從庫中的文檔,我明白,我得到一個指針存儲並直接使用庫中的數據。乳清我做type(y)
(其中y是指針)我得到<class 'module_name.wrapper_class_name.LP_c_double'>
。有了這個情況下,我仍然能夠通過像y[0][2]
數據索引,但我通過一個超級尷尬才能夠讓它進入numpy的:>>> np.frombuffer(np.core.multiarray.int_asbuffer( ctypes.addressof(y.contents), array_length*np.dtype(float).itemsize))
我發現這在一箇舊numpy
郵件列表thread from Travis Oliphant ,但不在numpy
文檔中。如果不是這樣的做法我嘗試如上我得到以下幾點:
>>> np.ctypeslib.as_array(y)
...
... BUNCH OF STACK INFORMATION
...
AttributeError: 'LP_c_double' object has no attribute '__array_interface__'
這是np.frombuffer
方法來做到這一點的最好或唯一途徑?我願意接受其他建議,但必須仍然希望使用numpy
,因爲我有許多其他後處理代碼依賴於numpy
功能,我想使用此數據。
你有控制輸出是否是C lib?你可以改變圖書館的API嗎? – 2010-12-04 20:03:09
是的 - 我有消息來源。我不確定要走哪條路,因爲指針方法允許Python直接對數據進行操作,我認爲在某些情況下這可能是一個優勢。在我的情況下,是的,將所有內容作爲`ctype`數組出現將是一個優勢。任何建議? – dtlussier 2010-12-04 20:09:49
我建議讓庫使用你在Python中分配的(NumPy-)數組並傳遞給庫。這樣,你可以採取相同的記憶,但你不必費心去做任何尷尬的轉換。你已經有了一個NumPy數組,並且將它傳遞給一個庫可以通過使用[`numpy.ctypeslib.ndpointer`]得到很好的支持(http://docs.scipy.org/doc/numpy/reference/routines.ctypeslib.html #numpy.ctypeslib.ndpointer)作爲參數類型傳遞給函數的ctypes包裝。 (如果這不清楚,只是問...) – 2010-12-04 20:46:16