Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将numpy ndarray转换为C float*[]_Python_C_Type Conversion_Swig - Fatal编程技术网

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*[],它基本上是一个二维浮点数数组..上面的示例应该适用于二维浮点数数组。这些是否也由a
float*
引用到第一个元素?对不起,我不是“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];
        }
    }