【问题标题】:Can I `fwrite` a memory view in Cython?我可以在 Cython 中“fwrite”一个内存视图吗?
【发布时间】:2019-11-20 13:10:36
【问题描述】:

是否可以使用 c fwrite 函数将 numpy 数组写入磁盘?从 Cython 内存视图文档中,我了解到“它们可以处理 C 数组”,但我没有看到这样的明确示例。

这是我正在尝试的:

cdef FILE *fptr
fptr = fopen("data.dat", "w")
cdef double[:] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
fwrite(array, sizeof(double), array.size, fptr)

但我得到以下编译错误:

Error compiling Cython file:
------------------------------------------------------------
...
def write_values(file_path):
    """Tracer code to write values to a C file."""
    cdef FILE *fptr
    fptr = fopen("data.dat", "w")
    cdef double[:] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
    fwrite(array, sizeof(double), array.size, fptr)
          ^
------------------------------------------------------------

write_with_c.pyx:23:11: Cannot assign type 'double[:]' to 'const void *'

这可能吗?

【问题讨论】:

    标签: cython fwrite typed-memory-views


    【解决方案1】:

    Per the docs,您应该传递第一个元素的地址(double* 应该 可以转换为 const void* 而无需强制转换),并且为了强制正确性,您可能需要显式声明带有cdef double[::1] array 的内存视图,它强制执行 C 连续内存视图,生成最后几行:

    cdef double[::1] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
    fwrite(&array[0], sizeof(double), array.size, fptr)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      相关资源
      最近更新 更多