我試圖加快我NumPy的代碼,並決定,我想實現一個特定的功能在我的代碼大部分時間都在C.擴展NumPy的與C函數
我其實是在C新秀,但我設法寫一個矩陣的每一行進行歸一化的函數總和爲1.我可以編譯它,並用一些數據(C語言)對它進行測試,並且它按照我的要求進行了測試。那時我爲自己感到驕傲。
現在我試圖從Python調用我的光榮函數,它應該接受2d-Numpy數組。
我已經試過各種事情
痛飲
痛飲+
numpy.i
ctypes的
我的函數原型
void normalize_logspace_matrix(size_t nrow, size_t ncol, double mat[nrow][ncol]);
因此,它需要一個指向可變長度數組的指針並將其修改到位。
我嘗試以下純痛飲接口文件:
%module c_utils
%{
extern void normalize_logspace_matrix(size_t, size_t, double mat[*][*]);
%}
extern void normalize_logspace_matrix(size_t, size_t, double** mat);
然後我會做(在Mac OS X 64位):
> swig -python c-utils.i
> gcc -fPIC c-utils_wrap.c -o c-utils_wrap.o \
-I/Library/Frameworks/Python.framework/Versions/6.2/include/python2.6/ \
-L/Library/Frameworks/Python.framework/Versions/6.2/lib/python2.6/ -c
c-utils_wrap.c: In function ‘_wrap_normalize_logspace_matrix’:
c-utils_wrap.c:2867: warning: passing argument 3 of ‘normalize_logspace_matrix’ from incompatible pointer type
> g++ -dynamiclib c-utils.o -o _c_utils.so
在Python然後我得到導入下面的錯誤我模塊:
>>> import c_utils
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initc_utils)
接下來我嘗試了這種方法使用SWIG + numpy.i
:
%module c_utils
%{
#define SWIG_FILE_WITH_INIT
#include "c-utils.h"
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (int DIM1, int DIM2, DATA_TYPE* INPLACE_ARRAY2)
{(size_t nrow, size_t ncol, double* mat)};
%include "c-utils.h"
不過,我並不比這得到任何進一步的:
> swig -python c-utils.i
c-utils.i:13: Warning 453: Can't apply (int DIM1,int DIM2,DATA_TYPE *INPLACE_ARRAY2). No typemaps are defined.
痛飲似乎並沒有找到numpy.i
定義的typemaps,但我不明白爲什麼,因爲numpy.i
是在同一個目錄下,SWIG不會抱怨它找不到它。
隨着ctypes我沒有得到很遠,但很快就迷失在文檔中,因爲我無法弄清楚如何將它傳遞給一個二維數組,然後得到結果。
所以有人可以告訴我魔術如何使我的功能在Python/Numpy中可用?
我在日誌空間正常化,避免數值溢出。我有很長的,但苗條的矩陣(即100,000x10)。這是我的代碼中唯一的一點,我必須遍歷根據行剖析器的行,這是代碼花費大部分時間的地方。我也看了一下cython,但這也是我的一個教育項目,所以我只想學習如何將我的Python與某些C混合在一起(如果需要的話)。 – oceanhug 2010-12-01 04:21:39