我可以在 Cython 中“fwrite”内存视图吗?
Can I `fwrite` a memory view in Cython?
是否可以使用 c fwrite
函数将 numpy 数组写入磁盘?从 Cython 内存视图文档中,我了解到 "they can handle C arrays" 但我没有看到此类的明确示例。
这是我正在尝试的:
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 *'
这可以吗?
Per the docs,你应该传递第一个元素的地址(double*
应该 可以转换为 const void*
而无需强制转换),为了强制正确性,您可能需要使用 cdef double[::1] array
显式声明内存视图,这会强制执行 C-contiguous 内存视图,从而生成最后几行:
cdef double[::1] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
fwrite(&array[0], sizeof(double), array.size, fptr)
是否可以使用 c fwrite
函数将 numpy 数组写入磁盘?从 Cython 内存视图文档中,我了解到 "they can handle C arrays" 但我没有看到此类的明确示例。
这是我正在尝试的:
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 *'
这可以吗?
Per the docs,你应该传递第一个元素的地址(double*
应该 可以转换为 const void*
而无需强制转换),为了强制正确性,您可能需要使用 cdef double[::1] array
显式声明内存视图,这会强制执行 C-contiguous 内存视图,从而生成最后几行:
cdef double[::1] array = numpy.array([.5, 1.5, 2.5, -9, 0.0, 5])
fwrite(&array[0], sizeof(double), array.size, fptr)