如何将numpy ndarray转换为C float*[]

2024-10-03 21:30:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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多维数组转换为正确的类型?在


Tags: 模块代码importnumpydataasnprandom
2条回答

好吧,对于每个可能面临和我一样的问题的人,这里是我如何最终解决它。在

首先,我更改了.h文件中的头和函数的.c文件中的头

void Flame_SetDataMatrix( Flame *self, float *data[], int N, int M, int T );

^{pr2}$

之后,我补充道

%apply (float* IN_ARRAY2, int DIM1, int DIM2) {
    (float *data, int N, int M)
};

到接口文件(flame.i)。这样就可以像这样在Python中调用函数:flame.Flame_SetDataMatrix( flameobject, data, T),其中的数据是一个二维的numpy数组。在

现在的“问题”是到达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];
        }
    }

最后,我可以用同样的“技巧”把一个二维的浮点数组变回一个numpy数组,我确实需要重新塑造它,但在numpy中这很容易。在

希望它能帮助别人。在

SciPy文档正是关于这一点的:如何通过SWIG将numpy数组传递给C代码(反之亦然)。看看here。在

基本上,有一个swig接口文件numpy.i,您可以用以下方式使用它。在swig接口文件中,您包括:

%{
#define SWIG_FILE_WITH_INIT
%}
%include "numpy.i"
%init %{
import_array();
%}

然后在您的接口文件中添加,在提到C函数之前:

^{pr2}$

这适用于普通的Cfloat数组。我不太清楚什么是float* []。您可能需要为此编写自己的类型映射,为此可以使用numpy.i提供的实用程序宏。但在上面提到的numpy.i文档或相关的swig typemap docs中都有解释

相关问题 更多 >