SWIG 和 NumPy¶
日期 | 2007-01-24(最后修改),2006-02-08(创建) |
---|
请注意,在当前版本的 NumPy(SVN)中,该目录包含一个完整的可工作示例,其中包含简单的 SWIG 类型映射,还包括一个适当的文件,以便您可以使用标准的 Python 机制安装它。这将帮助您快速入门。
为了了解如何编写真正最小的接口,下面是简单的 SWIG 接口文件 umfpack.i(适用于 SWIG < 版本 1.3.29)的相关部分,用于包装 UMFPACK 稀疏线性求解器库。完整的接口可以在 SciPy SVN 存储库中的目录中找到。如果您使用的是 SWIG > 版本 1.3.29,请参考 SciPy SVN 存储库中的文件,该文件略有不同。
在 [ ]
/*!
Gets PyArrayObject from a PyObject.
*/
PyArrayObject *helper_getCArrayObject( PyObject *input, int type,
int minDim, int maxDim ) {
PyArrayObject *obj;
if (PyArray_Check( input )) {
obj = (PyArrayObject *) input;
if (!PyArray_ISCARRAY( obj )) {
PyErr_SetString( PyExc_TypeError, "not a C array" );
return NULL;
}
obj = (PyArrayObject *)
PyArray_ContiguousFromAny( input, type, minDim, maxDim );
if (!obj) return NULL;
} else {
PyErr_SetString( PyExc_TypeError, "not an array" );
return NULL;
}
return obj;
}
%}
/*!
Use for arrays as input arguments. Could be also used for changing an array
in place.
@a rtype ... return this C data type
@a ctype ... C data type of the C function
@a atype ... PyArray_* suffix
*/
#define ARRAY_IN( rtype, ctype, atype ) \
%typemap( python, in ) (ctype *array) { \
PyArrayObject *obj; \
obj = helper_getCArrayObject( $input, PyArray_##atype, 1, 1 ); \
if (!obj) return NULL; \
$1 = (rtype *) obj->data; \
Py_DECREF( obj ); \
};
ARRAY_IN( int, const int, INT )
%apply const int *array {
const int Ap [ ],
const int Ai [ ]
};
ARRAY_IN( long, const long, LONG )
%apply const long *array {
const long Ap [ ],
const long Ai [ ]
};
ARRAY_IN( double, const double, DOUBLE )
%apply const double *array {
const double Ax [ ],
const double Az [ ],
const double B [ ]
};
ARRAY_IN( double, double, DOUBLE )
%apply double *array {
double X [ ]
};
然后,要包装的函数可以像这样
在 [ ]
int umfpack_di_solve( int sys, const int Ap [ ], const int Ai [ ],
const double Ax [ ], double X [ ], const double B [ ],
... );
部分作者:RobertCimrman、AndrewStraw、FernandoPerez、WilliamHunter
附件