返回Cython数组

Returning Cython array

本文关键字:数组 Cython 返回      更新时间:2023-10-16

如何正确初始化并返回Cython数组?例如:

cdef public double* cyTest(double[] input):
  cdef double output[3]
  for i in xrange(3):
    output[i] = input[i]**2
    print 'loop: ' + str(output[i])
  return output
cdef double* test = [1,2,3]
cdef double* results = cyTest(test)
for i in xrange(3):
  print 'return: ' + str(results[i])

这回报:

loop: 1.0->1.0
loop: 2.0->4.0
loop: 3.0->9.0
return: 1.88706086937e-299
return: 9.7051011575e+236
return: 1.88706086795e-299

显然,results仍然只指向垃圾,而不是它应该指向的值。不可否认,我对指针和数组语法的混合有点困惑,以及在Cython上下文中哪一种更可取/可能。

最后,我想从一个纯c++函数调用cyTest:

#include <iostream>
#include <Python.h>
#include "cyTest.h"
void main() {
  Py_Initialize();
  initcyTest();
  double input[3] = {1,2,3};
  double* output = cyTest(input);
  for(int i = 0; i < 3; i++)
    std::cout << "cout: " << output[i] << std::endl;
  Py_Finalize();
}

返回类似的结果:

loop: 1.0->1.0
loop: 2.0->4.0
loop: 3.0->9.0
cout: 1
cout: 6.30058e+077
cout: 6.39301e-308
有谁能解释一下我犯了什么错误吗?我想让它尽可能的简单。毕竟,它只是将一个数组从Cython返回到c++。如果没有必要,我将稍后处理动态内存分配。

您正在返回对本地数组(输出)的引用,这将不起作用。

试着把你的脚本改成:

from cpython.mem cimport PyMem_Malloc
cdef public double * cyTest(double[] input):
    cdef double * output = < double * >PyMem_Malloc( sizeof(double) * 3 )
    for i in xrange(3):
        output[i] = input[i]**2
        print 'loop: ' + str(output[i])
    return output

在c++代码中,

在你使用double* output问题free( output );

如果你想在pyx脚本中使用cdef double* results = cyTest(test),那么不要忘记使用PyMem_Free(results)