3

我有一个numpy.ndarraydtype 对象,它只包含其他不同长度的数组。我有 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 中将是一个很好的加速,因为它可以消除一直调用 inline 的开销。但是我如何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 回答