3

scipy の weave.inline を使用して、計算コストの高いタスクを実行しています。1 次元配列を Python スコープに戻す際に問題があります。Weave.inline は、値を Python スコープに戻す目的で、「return_val」と呼ばれる特別な引数を使用します。整数値を返す次の例はうまく機能します。

>>> 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 に答える