Python 返回Cython数组

Python 返回Cython数组,python,c++,cython,cpython,Python,C++,Cython,Cpython,如何正确初始化并返回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 = cyTe

如何正确初始化并返回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
所以很明显,
结果仍然只指向垃圾,而不是它应该指向的值。诚然,我对混合使用指针和数组语法有点困惑,在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();
}

有人愿意解释我犯了什么错误吗?我想让它尽可能简单。它只是将数组从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
来自cpython.mem cimport PyMem\u Malloc
cdef公共双*循环测试(双[]输入):
cdef double*输出=PyMem_Malloc(sizeof(double)*3)
对于x范围内的i(3):
输出[i]=输入[i]**2
打印“循环:”+str(输出[i])
返回输出
<>和在C++代码中,

使用完
double*输出后
issue
free(输出)

如果您想在pyx脚本中使用
cdef double*results=cyTest(test)
,那么不要忘记使用
PyMem\u Free(results)
,但是调用
Free(output)
会触发一个断点(
指定给RtlValidateHeap(003D0000,00AEBED0)
)的无效地址是的,这很好(但当然只在Cython中). 现在,我已经通过将一个C数组作为参数传递给Cython而不是返回一个来回避这个问题。
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