首页 文章

有指向数据的指针 . 在Fortran命令中需要Numpy数组 . 想要使用Cython

提问于
浏览
4

这对我来说是一个非常常见的用例 . 我有一个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 回答

  • 2

    这有点hackish,但您可以颠倒维度的顺序然后返回转置 . 这应该使您的步伐正确,但不能复制数据 .

    cimport numpy as cnp
    cnp.import_array()
    
    cdef double a1[10]
    for i in range(10):
        a1[i] = i
    
    # C order
    a2 = cnp.PyArray_SimpleNewFromData(2, [2, 5], cnp.NPY_FLOAT64, a1)
    # fortran order
    a3 = cnp.PyArray_SimpleNewFromData(2, [5, 2], cnp.NPY_FLOAT64, a1).T
    # a2 and a3 point to the same data
    a2[0,0] = 10.
    print a2
    print a3
    

相关问题