我在C
中有代码,我想在python
中使用它,我使用SWIG来包装C代码,并成功地在python代码中导入了一个python模块。在
现在我有了以下代码:
import flame
import numpy as np
data = np.random.rand(3,2).astype(np.float32, copy=False)
N = 3
M = 2
print data
flameobject = flame.Flame_New()
flame.Flame_SetDataMatrix( flameobject, data, N, M, 0 )
这就产生了错误:
^{pr2}$我知道应该将float array pointer
传递给方法,但是如何将Numpy多维数组转换为正确的类型?在
好吧,对于每个可能面临和我一样的问题的人,这里是我如何最终解决它。在
首先,我更改了
.h
文件中的头和函数的.c
文件中的头到
^{pr2}$之后,我补充道
到接口文件(
flame.i
)。这样就可以像这样在Python中调用函数:flame.Flame_SetDataMatrix( flameobject, data, T)
,其中的数据是一个二维的numpy数组。在现在的“问题”是到达C函数的数组格式错误,因为我们需要一个双数组(在本例中是指向浮点指针的指针)。在
解决方案是转换这个数组,它被包装在一个维度中,在c代码中重建双数组,如下所示:
最后,我可以用同样的“技巧”把一个二维的浮点数组变回一个numpy数组,我确实需要重新塑造它,但在numpy中这很容易。在
希望它能帮助别人。在
SciPy文档正是关于这一点的:如何通过SWIG将numpy数组传递给C代码(反之亦然)。看看here。在
基本上,有一个swig接口文件
numpy.i
,您可以用以下方式使用它。在swig接口文件中,您包括:然后在您的接口文件中添加,在提到C函数之前:
^{pr2}$这适用于普通的C
float
数组。我不太清楚什么是float* []
。您可能需要为此编写自己的类型映射,为此可以使用numpy.i
提供的实用程序宏。但在上面提到的numpy.i文档或相关的swig typemap docs中都有解释相关问题 更多 >
编程相关推荐