我试图加快我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