如何正确初始化并返回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 ++。如果没有必要,我稍后会处理动态内存分配。
答案 0 :(得分:1)
您正在返回对本地数组(输出)的引用,这将无效。
尝试将脚本更改为:
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)