簡體   English   中英

使用scipy.weave.inline迭代數組數組

[英]Iterate over array of arrays with scipy.weave.inline

我有一個numpy.ndarray對象的numpy.ndarraynumpy.ndarray包含不同長度的其他數組。 我有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中將是一個很好的加速,因為它將消除一直調用內聯的開銷。 但是如何從C中以迭代的方式獲得arr

所以我終於想出了如何做到這一點。 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'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM