簡體   English   中英

如何將 c_uint 的 ctypes 數組轉換為 numpy 數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM