[英]How to convert a ctypes array of c_uint to a numpy array
我有以下 ctypes 數組:
data = (ctypes.c_uint * 100)()
我想創建一個 numpy 數組np_data
包含來自 ctypes 數組數據的整數值(ctypes 數組顯然稍后會填充值)
我已經看到 numpy 中有一個 ctypes 接口( https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.ctypes.html ),但據我所知,這只是為了獲取 ctypes來自一個 numpy 數組,而不是相反。
我顯然可以遍歷data
並一個一個地填充np_data
數組項,但我想知道是否有更有效/更直接的方法來完成這項任務。
您可以使用[NumPy]: numpy.ctypeslib.as_array(obj, shape=None) 。
>>> import ctypes as ct >>> import numpy as np >>> >>> >>> CUIntArr10 = ctypes.c_uint * 10 >>> >>> ui10 = CUIntArr10(*range(10, 0, -1)) >>> >>> [e for e in ui10] # The ctypes array [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] >>> >>> np_arr = np.ctypeslib.as_array(ui10) >>> np_arr # And the np one array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1], dtype=uint32)
沒有找到具體的代碼行(我也沒有測試我的假設),但我感覺內容復制是通過單個memcpy調用完成的,這比從Python “手動”執行操作要快得多.
可能最快的是使用np.frombuffer
。 它可以與實現緩沖區協議的每個對象一起使用,特別是與 ctypes-arrays 一起使用。
np.frombuffer
的主要優點是,ctypes-array 的內存根本不被復制,而是共享:
data = (ctypes.c_uint * 100)()
arr = np.frombuffer(data, dtype=np.uint32)
arr.flags
# ...
# OWNDATA : False
# ...
通過設置
arr.flags.writable = False
可以確保不會通過 numpy-array arr
更改數據。
如果確實需要復制數據,則可以將通常的 numpy 功能用於arr
。
@CristiFati 的回答中提出的np.ctypeslib.as_array
似乎是創建 numpy-array 的更好方法:
dtype
(這是一件好事:它消除了錯誤(如在我的原始帖子中,我使用np.uint
(在我的機器上表示 64 位無符號整數)而不是np.uint32
(這也可能不是在某些架構上是正確的)。以上實驗證明:
arr = np.ctypeslib.as_array(data)
arr.flags
# ...
# OWNDATA : False
# ...
arr.dtype
# dtype('<u4')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.