将 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 中,我需要将 output1output2 转换为 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 的形式获得输出。我应该如何将指针 ptnOutput1ptnOutput2 对齐到两个 numpy 数组? 我试过np.frombuffernp.PyArray_SimpleNewFromData 但没有运气。我总是遇到分段错误。 知道如何正确地做到这一点吗?

【问题讨论】:

暂时忽略它的 Cython 方面,你会如何在 C 中调用它?我以为 ptnOutput1ptnOutput2 在您调用 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 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将巨大的 2D NumPy 数组写入缓冲区

根据缓冲区长度将空终止字符数组复制到 std::string

将字节缓冲区内容复制到结构中

如何在 Swift 3 中将 [UInt8] 数组复制到 C 指针?

将字符串的一部分复制到C中的缓冲区中

c_cpp 将int复制到字节缓冲区