3

我正在使用 scipy 的 weave.inline 来执行计算量大的任务。我在将一维数组返回到 python 范围时遇到问题。Weave.inline 使用一个名为“return_val”的特殊参数来将值返回到 python 范围。以下返回整数值的示例效果很好:

>>> from scipy.weave import inline
>>> print inline(r'''int N = 10; return_val = N;''')
10

但是,以下示例确实可以在不提示错误的情况下进行编译,但不会返回我期望的数组:

>>> from scipy.weave import inline
>>> code =\
    r'''                                                              
       int* pairs;                                                       
       int  lenght = 0;                                                      
       for (int i=0;i<N;i++){                                            
         lenght   += 1;                                                     
         pairs     = (int *)malloc(sizeof(int)*lenght);                       
         pairs[i]  = i;
         std::cout << pairs[i] << std::endl;              
       }                                                                 
       return_val = pairs;                                               
    '''
 >>> N  = 5
 >>> R = inline(code,['N'])
 >>> print "RETURN_VAL:",R
 0
 1
 2
 3
 4
 RETURN_VAL: 1    

我需要动态重新分配数组“对”的大小,这就是为什么我不能传递 numpy.array 或 python 列表本身。

4

2 回答 2

4

您需要做的就是使用原始的 python c-api 调用,或者如果您正在寻找更方便的东西,可以使用内置的 scipy weave 包装器。

不能保证泄漏或效率,但它应该看起来有点像这样:

from scipy.weave import inline

code = r'''
    py::list ret; 
    for(int i = 0; i < N; i++) {
        py::list item;
        for(int j = 0; j < i; j++) {
            item.append(j);
        }
        ret.append(item);
    }
    return_val = ret;
    '''
N  = 5 
R = inline(code,['N'])
print R
于 2012-07-09T10:25:53.240 回答
2

如果您事先完全不知道输出数组的大小,则必须在您的内联代码中创建它。我很确定使用 malloc 分配的数组会导致内存泄漏,因为您无法控制何时释放此内存。

解决方案是创建一个 numpy 数组,用函数的结果填充它并返回它。

import scipy.weave

code = r"""
npy_intp dims[1] = {n};

PyObject* out_array = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
double* data = (double*) ((PyArrayObject*) out_array)->data;

for (int i=0; i<n; ++i) data[i] = i;

return_val = out_array;
Py_XDECREF(out_array);
"""

n = 5
out_array = scipy.weave.inline(code, ["n"])
print "Array:", out_array
于 2012-07-09T10:45:10.043 回答