从双指针(来自CythonGSL)获取numpy ndarray(查看,而不是复制)

时间:2015-09-14 18:48:49

标签: python numpy cython

在使用CythonGSL时,我发现自己需要为“gsl vector”创建一个numpy.ndarray视图,该视图在以下cython代码中定义:

ctypedef struct gsl_vector:
    size_t size
    size_t stride
    double *data
    gsl_block *block
    int owner

所以我可以访问向量的大小以及指向它的指针。我怎样才能使用这些来获得这个向量的numpy.ndarray视图?

这是我失败的尝试:

import numpy as np
cdef mycast(const gsl_vector *v):
    cdef size_t n = v.size
    return np.ctypeslib.as_array((ctypes.c_double * n).from_address(v.data))

但是,

失败了
Cannot convert 'const double *' to Python object

进行投射的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

这是一件有用的事情:

import numpy as np
from cython cimport view
cdef mycast(const gsl_vector *v):
    cdef size_t n = v.size
    cdef double[:] myview = <double[:n]> v.data
    return np.asarray(myview)

阅读cython typed memoryviews文档是有帮助的,但我仍然会欣赏一些关于最佳实践(效率和持续正确性)的答案。