将 C 缓冲区的内容复制到 numpy 数组
Posted
技术标签:
【中文标题】将 C 缓冲区的内容复制到 numpy 数组【英文标题】:Copying content of C buffer to numpy array 【发布时间】:2016-11-04 16:08:43 【问题描述】:我在 C 中有一个这样的函数:
源文件
// foo.cpp
int foo(int input1, double *output1, int size1, int* output2, int size2)
// does stuff and allocate space for output1 and output2
return 0;
头文件
// foo.h
int foo(int input1, double *output1, int size1, int* output2, int size2);
在 Cython 中,我需要将 output1
和 output2
转换为 numpy 数组,因此在我的 foo.pyx
中,我执行以下步骤:
cdef extern from "foo.h":
cdef int foo(int input1, double* output1, int size1, double* output2, int size2)
cdef double* ptnOutput1
cdef int* ptnOutput2
foo(1, ptnOutput1, 10, ptnOutput2, 10)
但现在我无法以两个np.array
的形式获得输出。我应该如何将指针 ptnOutput1
和 ptnOutput2
对齐到两个 numpy 数组?
我试过np.frombuffer
和np.PyArray_SimpleNewFromData
但没有运气。我总是遇到分段错误。
知道如何正确地做到这一点吗?
【问题讨论】:
暂时忽略它的 Cython 方面,你会如何在 C 中调用它?我以为ptnOutput1
和 ptnOutput2
在您调用 foo
时需要已经分配(然后填充它们的内容)?
cython.readthedocs.io/en/latest/src/userguide/memoryviews.html 很好地描述了如何使用数组、cython 本机内存视图和 C 数组。
【参考方案1】:
numpy 文档提到了这一点
为了使用另一个扩展模块的C-API,必须调用
import_array
函数
您似乎收到了分段错误错误,因为您没有在代码中包含 import_array。
import_array
的内部机制比您想象的要复杂,因为它实际上是一个非常冗长的宏,而不是一个普通的函数。更多信息请参考this
【讨论】:
以上是关于将 C 缓冲区的内容复制到 numpy 数组的主要内容,如果未能解决你的问题,请参考以下文章
根据缓冲区长度将空终止字符数组复制到 std::string