返回Cython数组
Returning Cython array
如何正确初始化并返回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)
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 将数组/向量发送到 c++ 脚本的 cython 示例
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 如何通过 cython 将 numpy 数组列表传递给 C++
- 在 Cython 中创建一个连续数组并将其传递给C++
- Cython 中对象动态大小的数组
- Cython:从参考获得时缺少两个前元素的 Numpy 数组
- 如何将 numpy 数组正确传递给 Cython 函数
- 在Cython中封装std::数组,并将其暴露给内存视图
- 返回Cython数组