Python 如何将numpy ndarray转换为C float*[]
我在Python 如何将numpy ndarray转换为C float*[],python,c,type-conversion,swig,Python,C,Type Conversion,Swig,我在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( f
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 )
这就产生了错误:
TypeError: in method 'Flame_SetDataMatrix', argument 2 of type 'float *[]'
我知道我应该将一个
浮点数组指针
传递给该方法,但是我如何才能将我的Numpy多维数组转换为正确的类型?有SciPy文档说明了这一点:如何通过SWIG将Numpy数组传递给C代码(反之亦然)。看一看
基本上,有一个swig接口文件numpy.i
,您可以按照以下方式使用它。在swig接口文件中,您包括:
%{
#define SWIG_FILE_WITH_INIT
%}
%include "numpy.i"
%init %{
import_array();
%}
然后添加到接口文件中,在提到C函数之前:
%apply ( float* IN_ARRAY2, int DIM1, int DIM2 ) {
(float* your_array_parameter_name, int N_parameter_name, int M_parameter_name)
};
这适用于普通的C
float
数组。我不太清楚什么是float*[]
。您可能需要为此编写自己的类型映射,为此您可以使用numpy.i
提供的实用程序宏。但是上面提到的numpy.i文档或相关的中都解释了这一点。好吧,对于所有可能面临与我相同问题的人,这里是我最终解决问题的方法
首先,我将函数的.h
文件和.c
文件中的头从
void Flame_SetDataMatrix( Flame *self, float *data[], int N, int M, int T );
到
在那之后,我又加了一句
%apply (float* IN_ARRAY2, int DIM1, int DIM2) {
(float *data, int N, int M)
};
到接口文件(flame.i
)。这使得在Python中调用函数成为可能,如下所示:flame.flame\u SetDataMatrix(flameobject,data,T)
,其中数据是一个二维数组
现在的“问题”是,到达C函数的数组格式错误,因为我们需要一个双数组(在本例中是指向浮点指针的指针)
解决方案是将此数组转换为一维,在c代码中重建双数组,如下所示:
//n = number of rows, m= number of columns columns
void Flame_SetDataMatrix( Flame *self, float *data, int n, int m, int dt )
{
//convert data to float** for later use
int i=0, j=0;
float ** data2 = (float**) calloc( n, sizeof(float*) );
for (i=0; i<n; i++){
data2[i] = calloc( m, sizeof(float) );
for (j=0; j<m; j++){
//the data is in a single array row after row, so i*columns+j
data2[i][j] = data[i * m + j];
}
}
//n=行数,m=列数
无效火焰设置数据矩阵(火焰*自身,浮动*数据,整数n,整数m,整数dt)
{
//将数据转换为浮点**以供以后使用
int i=0,j=0;
float**data2=(float**)calloc(n,sizeof(float*);
对于(i=0;i可能相关:谢谢!虽然我还不知道如何处理float*[],它基本上是一个二维浮点数数组..上面的示例应该适用于二维浮点数数组。这些是否也由afloat*
引用到第一个元素?对不起,我不是“C”person。这是一个指针数组,不幸的是代码对我不起作用。我还尝试将float*data[]
放入apply函数中,该函数似乎传递了引用,但我认为它创建了一个指针错误,因为它在没有消息的情况下崩溃。这就是我的想法。提供的函数用于数组(也是2D)这也是numpy数组的内部数据结构。如果需要一个指针数组来进行浮点运算,那么需要编写自己的转换函数(通过为swig类型映射编写C代码).好的,非常感谢,你至少让我走上了正确的道路。我用肮脏的方式做了这件事,我添加了c代码float**data2=&data;
,并将标题改为float*data
,这样它就可以匹配正常的类型映射。
//n = number of rows, m= number of columns columns
void Flame_SetDataMatrix( Flame *self, float *data, int n, int m, int dt )
{
//convert data to float** for later use
int i=0, j=0;
float ** data2 = (float**) calloc( n, sizeof(float*) );
for (i=0; i<n; i++){
data2[i] = calloc( m, sizeof(float) );
for (j=0; j<m; j++){
//the data is in a single array row after row, so i*columns+j
data2[i][j] = data[i * m + j];
}
}