3

長さの異なる他の配列のみをnumpy.ndarray含む of dtype オブジェクトがあります。ネストされた配列でいくつかの計算を行うCコードがありますが、numpy C-APIを使用して反復するときの内部配列とそのサイズを取得する方法がわかりません。したがって、現在は次のようになっています。

from scipy.weave import inline
import numpy as np

arrs = np.zeros(10, dtype=object)
for i in xrange(10):
    arrs[i] = np.arange(i*i)

for arr in arrs:
    inline(ccode, ['arr', 'other', 'args'])

私はそれが最適な構造ではないことを知っていますが、私が推測する疎行列でもありません。arrsは非常に長く、約 100k であるため、この python ループを C に含めると、常にインライン呼び出しのオーバーヘッドがなくなるため、大幅に高速化されます。arrしかし、C 内から反復的な方法で取得するにはどうすればよいでしょうか?

4

1 に答える 1

1

だから私は最終的にそれを行う方法を考え出しました。scipy.weaveオブジェクト配列が苦手なようですので、まずはリストに変換してみました。その後、Python C-API を使用してリスト項目を取得できます。オブジェクト変換は、他のプリコンパイル済みインライン C コードから直接取得されます。

arrs = list()
for i in xrange(5):
    arrs.append(np.arange(i * i, dtype=int))
code = r"""
    long arrs_size = PyList_Size(arrs);
    for (long i=0; i<arrs_size; i++) {
        PyArrayObject* arr_array = convert_to_numpy(PyList_GetItem(arrs,i), "arr");
        conversion_numpy_check_type(arr_array,PyArray_LONG, "arr");
        npy_intp* Narr = arr_array->dimensions;
        npy_intp* Sarr = arr_array->strides;
        int Darr = arr_array->nd;
        long* arr = (long*) arr_array->data;
        long arr_size = 1;
        for (int n=0; n<Darr; n++) arr_size *= Narr[n];
        for (int j=0; j<arr_size; j++) printf("%ld ", arr[j]);
        printf("\n");
    }
"""
inline(code, ['arrs'])
于 2013-05-04T10:43:14.047 に答える