2013-05-03 148 views
3

我有一個dtype對象的numpy.ndarray,它只包含其他不同長度的數組。我有C代碼,它使用嵌套數組進行一些計算,但是我不確定如何獲取內部數組,並且在使用numpy C-API迭代時它的大小很大。所以目前看起來是這樣的:使用scipy.weave.inline遍歷數組的陣列

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

回答

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'])