如何将双指针ctype转换为numpy数组?

2024-10-01 00:34:10 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我得到了这个代码,我用它来把numpy2d数组转换成ctype双指针。你知道吗

import ctypes as ct
import numpy as np

arr = np.empty([500, 500], dtype=np.uint8)

UI8Ptr = ct.POINTER(ct.c_uint8)
UI8PtrPtr = ct.POINTER(UI8Ptr)

ct_arr = np.ctypeslib.as_ctypes(arr)
UI8PtrArr = UI8Ptr * ct_arr._length_
ct_ptr = ct.cast(UI8PtrArr(*(ct.cast(row, UI8Ptr) for row in ct_arr)), UI8PtrPtr)

我怎样才能将ct\U ptr投射回numpy 2d阵列?你知道吗


Tags: importnumpyasnpctypesrowarrct
1条回答
网友
1楼 · 发布于 2024-10-01 00:34:10

注意:这是[SO]: How to pass a 2d array from Python to C?的后续行动。你知道吗

一种方法是经历以下状态:

  1. CTypes指针
  2. Python列表
  3. NumPy数组

自动出现2个观察结果:

  • 这是非常低效的,但不幸的是我不知道如何摆脱#2。(罪魁祸首)
  • 指针包含有关基类型的信息,但不包含创建它的数组的维度的信息,因此必须“保存”它们,因为在“解构”指针时需要它们

代码00.py:

#!/usr/bin/env python3

import sys
import ctypes as ct
import numpy as np


def main():
    dim0 = 3
    dim1 = 4
    arr0 = np.empty([dim0, dim1], dtype=np.uint8)
    print("Initial array:\n{0:}".format(arr0))

    UI8Ptr = ct.POINTER(ct.c_uint8)
    UI8PtrPtr = ct.POINTER(UI8Ptr)

    ct_arr = np.ctypeslib.as_ctypes(arr0)
    UI8PtrArr = UI8Ptr * ct_arr._length_
    ct_ptr = ct.cast(UI8PtrArr(*(ct.cast(row, UI8Ptr) for row in ct_arr)), UI8PtrPtr)

    arr1 = np.array([[ct_ptr[i][j] for j in range(dim1)] for i in range(dim0)], dtype=ct_ptr._type_._type_._type_)
    print("\nFinal array:\n{0:}".format(arr1))
    print("\nEqual arrays: {0:}".format(np.array_equal(arr0, arr1)))


if __name__ == "__main__":
    print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    main()
    print("\nDone.")

输出

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058781199]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32

Initial array:
[[ 96 100 101 115]
 [105 114 101 100]
 [ 96  96  32 115]]

Final array:
[[ 96 100 101 115]
 [105 114 101 100]
 [ 96  96  32 115]]

Equal arrays: True

Done.

有关此主题的详细信息,请查看[SO]: Numpy error when converting array of ctypes types to void pointer (@CristiFati's answer)。你知道吗

相关问题 更多 >