<p>使用SWIG需要整个结构的类型映射。仅针对指针成员的Tyepmaps是不够的,因为它们没有上下文来知道初始化NumPy数组的大小。我用下面的类型图成功地得到了我想要的(基本上是从numpy.I复制粘贴的,可能不是很健壮):</p>
<pre><code>%typemap (in,numinputs=0) element * (element temp) {
$1 = &temp;
}
%typemap (argout) element * {
/* weight */
{
npy_intp dims[1] = { $1->ngi };
PyObject * array = PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, (void*)($1->weight));
if (!array) SWIG_fail;
$result = SWIG_Python_AppendOutput($result,array);
}
/* l */
{
npy_intp dims[2] = { $1->ngi, $1->dim };
PyObject * array = PyArray_SimpleNewFromData(2, dims, NPY_DOUBLE, (void*)($1->l));
if (!array) SWIG_fail;
$result = SWIG_Python_AppendOutput($result,array);
}
/* n */
{
npy_intp dims[2] = { $1->ngi, $1->vertices };
PyObject * array = PyArray_SimpleNewFromData(2, dims, NPY_DOUBLE, (void*)($1->n));
if (!array) SWIG_fail;
$result = SWIG_Python_AppendOutput($result,array);
}
/* dn */
{
npy_intp dims[3] = { $1->ngi, $1->vertices, $1->dim };
PyObject * array = PyArray_SimpleNewFromData(3, dims, NPY_DOUBLE, (void*)($1->dn));
if (!array) SWIG_fail;
$result = SWIG_Python_AppendOutput($result,array);
}
}
</code></pre>
<p>这与C函数的工作方式不同,它返回一个NumPy数组的元组,其中包含我想要的数据,这比以后从<code>element</code>对象中提取数据要方便得多。第一个typemap进一步消除了传入<code>element</code>类型的对象的需要。因此,我可以对python用户完全隐藏<code>element</code>结构。在</p>
<p>python接口最终如下所示:</p>
^{pr2}$