Cython如何使用memcpy从numpy缓冲区复制到C结构?

Cython如何使用memcpy从numpy缓冲区复制到C结构?,numpy,cython,memcpy,Numpy,Cython,Memcpy,此示例在Jupyter notebook中编译并运行,并演示了该问题 我这一行有个问题 memcpy(line.points, <point_t *> temp.data, sizeof(point_dtype) * n) 实际的错误是: cdef cnp.ndarray temp = np.empty(n, dtype=point_dtype) 如果没有cdef cnp.ndarray则temp.data是某种Python对象(不确定具体是什么),然后将其转换为点*,因

此示例在Jupyter notebook中编译并运行,并演示了该问题

我这一行有个问题

    memcpy(line.points, <point_t *> temp.data, sizeof(point_dtype) * n)
实际的错误是:

cdef cnp.ndarray temp = np.empty(n, dtype=point_dtype)
如果没有
cdef cnp.ndarray
temp.data
是某种Python对象(不确定具体是什么),然后将其转换为
点*
,因此从它复制失败

我认为原则上应该将
Point
定义为
cdef-packed-struct-Point
,因为我认为Numpy数据是内部打包的。在这种情况下,我不认为这有什么区别

最好使用MemoryView,然后可以断言数组的C连续性

cdef point_t[::1] temp_view = temp

# Memory copy from the array's buffer into the struct
memcpy(line.points, &temp_view[0], sizeof(point_dtype) * n)

在这种情况下,我不会费心键入
temp
points
,因为这样做没有什么好处。memoryview方法的优点在于它避免了强制转换(强制转换有助于掩盖您的真实错误),并且它包括一些检查,以确保您对数据大小/布局和连续性的假设是正确的。

非常感谢!我被这件事难住了好几个小时。两个快速问题:1)您是否介意解释一下
&temp\u view[0]
部分,它是否是“获取内存视图中第一个值的地址”,2)我刚刚检查了cython文档,但似乎在编译时没有任何选项可以帮助捕获这一点,例如,一个cython选项,如“require types”1)它确实是“获取内存视图中第一个值的地址”。2)我认为没有编译器选项要求键入所有内容。问题的一部分是,任何时候使用
强制转换时,你都在说“我知道得更好”,如果你错了,那么所有赌注都没有了。