将 C 指针转换为 Python numpy 数组

Posted

技术标签:

【中文标题】将 C 指针转换为 Python numpy 数组【英文标题】:Converting C pointer to Python numpy array 【发布时间】:2022-01-03 16:25:27 【问题描述】:

我是 C 和 Python 中的 ctypes 的新手。

我需要将指向双精度数组的 C 指针转换为 Python numpy 数组。

我的出发点如下:

import ctypes
import numpy as np
arrayPy = np.array([[0, 1, 2], [3, 4, 5]])
out_c = arrayPy.ctypes.data_as(ctypes.POINTER(ctypes.c_double))

请问如何有效地将“out_c”对象转换为 Python numpy 数组?

【问题讨论】:

【参考方案1】:

起点不正确,因为arrayPy 是一个整数数组。设置dtype 以创建一个双精度数组:

import ctypes
import numpy as np

arrayPy = np.array([[0, 1, 2], [3, 4, 5]], dtype=ctypes.c_double)
out_c = arrayPy.ctypes.data_as(ctypes.POINTER(ctypes.c_double))
print(out_c, out_c[:arrayPy.size])

输出是一个指向双精度的 C 指针。切片指针将显示数据,但您需要知道大小以不遍历数据的末尾:

<__main__.LP_c_double object at 0x000001A2B758E3C0> [0.0, 1.0, 2.0, 3.0, 4.0, 5.0]

我需要将指向双精度数组的 C 指针转换为 Python numpy 数组。

要将指针转换回 numpy 数组,如果您知道它的形状,可以使用以下方法:

a = np.ctypeslib.as_array(out_c, shape=arrayPy.shape)
print(a)

输出:

[[0. 1. 2.]
 [3. 4. 5.]]

【讨论】:

谢谢。这种方法解决了我的问题。

以上是关于将 C 指针转换为 Python numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章

将 C/C++ 向量快速转换为 Numpy 数组

如何将指向c数组的指针转换为python数组

Python - 使用 OpenCV 将字节图像转换为 NumPy 数组

将 NumPy 数组转换为 cufftComplex

将 MySQL 结果集转换为 NumPy 数组的最有效方法是啥?

如何使用 SWIG 将 C++ 数组转换为 Python 列表?