从cython中的指针创建numpy数组

从cython中的指针创建numpy数组,numpy,cython,Numpy,Cython,在阅读了大量关于numpy/cython的文档之后,我仍然无法从cython中的指针创建numpy数组。情况如下。我有一个cython(*.pyx)文件,其中包含一个回调函数: cimport numpy cdef void func_eval(double* values, int values_len, void* func_data): func = (<object> func_da

在阅读了大量关于numpy/cython的文档之后,我仍然无法从cython中的指针创建numpy数组。情况如下。我有一个cython(*.pyx)文件,其中包含一个回调函数:

cimport numpy

cdef void func_eval(double* values,
                    int values_len,
                    void* func_data):


    func = (<object> func_data)

    # values.: contiguous array of length=values_len

    array = ???

    # array should be a (modifiable) numpy array containing the
    # values as its data. No copying, no freeing the data by numpy.

    func.eval(array)
第二次编辑:

关于:虽然这些问题是相关的,但正如前面指出的,给出的第一个答案是非常脆弱的,依赖于内存数据标志,这可以说是一个实现细节。此外,问题和答案已经过时,cython API自2014年以来已经扩展。幸运的是,我自己解决了这个问题

首先,您可以将原始指针强制转换为在同一基础内存上运行的类型化MemoryView,而无需通过

cdef double[:] values_view = <double[:values_length]> values
cdef双[:]值\u视图=值 然而,这还不够,正如我所说的,我想要一个numpy数组。但如果MemoryView具有numpy数据类型,则可以将其转换为numpy数组。因此,该目标可以通过以下方式在一条线路上实现:

array = np.asarray(<np.float64_t[:values_length]> values)
array=np.asarray(值)

可以很容易地检查阵列是否在不拥有它的情况下在正确的内存段上运行。

您能给出一个最小的可运行示例吗?在我的脑海里,我甚至不知道如何建立一些样板来重现你所描述的场景。好吧,这样就可以了。从上面的副本中,您还应该注意我的回答中关于正确内存处理的警告:代码有一个小问题:
值可以在
数组
仍处于活动状态时解除分配。更好的策略是使用一个拥有
值的Python对象,并使用
PyArray\u SetBaseObject
来确保该对象的生命周期。
array = np.asarray(<np.float64_t[:values_length]> values)