这对我来说是一个非常常见的用例 . 我有一个C函数,它返回一个指向双精度的指针:
//myheader.h
double *mycfuntion(...)
我知道返回的数据的维度 . 我也知道数据是 Fortran 订购的 . 我想编写一个Cython "shim"来将数据作为Numpy数组导入Python:
#myshim.pyx
import numpy
cimport numpy as cnumpy
cnumpy.import_array()
cdef extern from "myheader.h" :
double *mycfunction(...)
def mypyfunc(...) :
cdef double *data = mycfunction(...)
**MAGIC**
return outarray
MAGIC的想法
(A) cdef cnumpy.ndarray[ cnumpy.double_t, mode='fortran', ...] outarray
这将是最方便的做事方式 . 但是,这里缺少's something critical that I' m,关于如何将指针 data
转换为我可以传递给cnumpy.ndarray构造函数的缓冲区 . 我试过了:
cdef cnumpy.ndarray[ cnumpy.double_t, mode='fortran', ...] outarray
cdef bytes databuffer = <char *>data
outarray = numpy.ndarray(buffer=databuffer, dtype=numpy.double, ...)
TypeError: buffer is too small for requested array
这种方法始终失败
(B) Numpy C-API
我已经使用了来自Cython的 cnumpy.PyArray_SimpleNewFromData(...)
. 它工作得很好 . 问题是它不支持flags参数,因此我可以在纯C实现中使用't tell it to construct a Fortran array. The alternative that I' . 它接受旗帜 . 这种方法冗长且痛苦,意味着通过尚未导入的 extern
块从numpy获取一些符号 . 必须有一个更好的方法 .
我一直在谷歌搜索这个问题,但没有出现任何明显的问题 . 也许我是个白痴 . 或者只是睡觉 . 干杯!
1 回答
这有点hackish,但您可以颠倒维度的顺序然后返回转置 . 这应该使您的步伐正确,但不能复制数据 .