Swig和多维数组

2024-05-18 06:52:44 发布

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

我使用Swig将python与C代码进行接口。在

我想调用一个C函数,它接受一个包含int**var的结构作为参数:

typedef struct
{
    (...)
    int** my2Darray;
} myStruct;

void myCFunction( myStruct struct );

我在和多维数组做斗争。在

我的代码如下:

在接口文件中,我是这样使用carray的:

^{pr2}$

在python中,我有:

myStruct = myModule.myStruct()
var = myModule.intArrayArray(28)

for j in range(28):
    var1 = myModule.intArray(28)

    for i in range(28):
        var1[i] = (...) filling var1 (...)

    var[j] = var1

myStruct.my2Darray = var

myCFonction( myStruct )

我在myStruct.my2Darray = var行上得到一个错误:

TypeError: in method 'maStruct_monTableau2D_set', argument 2 of type 'int **'

我对%array_class( intArray, intArrayArray )这一行表示怀疑。 我尝试使用int*的typedef创建如下数组: %array_class( myTypeDef, intArrayArray ); 但似乎没用。在

你知道如何在Swig中处理多维数组吗?在

谢谢你的帮助。在


Tags: 代码inforvarrange数组structswig
2条回答

这就是我处理二维数组的方法。我使用的技巧是编写一些内联代码来处理数组的创建和变异。一旦完成,我就可以使用这些函数来完成我的出价。在

下面是示例代码。在

dArray.我

%module ddarray
%inline %{
// Helper function to create a 2d array
int* *int_array(int rows, int cols) {
    int i;
    int **arr = (int **)malloc(rows * sizeof(int *));
    for (i=0; i<rows; i++)
        arr[i] = (int *)malloc(cols * sizeof(int)); 
    return arr;
 }

void *setitem(int **array, int row, int col, int value) {
    array[row][col] = value;
    }
%}

ddarray.c

^{pr2}$

示例Python脚本

import ddarray

a = ddarray.int_array(2, 3)
for i in xrange(2):
    for j in xrange(3):
        ddarray.setitem(a, i, j, i + 1)

print ddarray.calculate(a, 2, 3)

你考虑过用numpy来做这个吗?我已经用NoMIP和我的Sigg包裹的C++项目来做一个二维、STD:一维的、二维的和3D的数组:复杂的元素,取得了很大的成功。在

您需要get numpy.i并在python环境中安装numpy。在

下面是一个如何构建它的示例:

.i文件:

// Numpy Related Includes:
%{
#define SWIG_FILE_WITH_INIT
%}
// numpy arrays
%include "numpy.i"
%init %{
import_array(); // This is essential. We will get a crash in Python without it.
%}
// These names must exactly match the function declaration.
%apply (int* INPLACE_ARRAY2, int DIM1, int DIM2) \
      {(int* npyArray2D, int npyLength1D, int npyLength2D)}

%include "yourheader.h"

%clear (int* npyArray2D, int npyLength1D, int npyLength2D);

.h文件:

^{pr2}$

.cpp文件:

void arrayFunction(int* npyArray2D, int npyLength1D, int npyLength2D)
{
    for(int i = 0; i < npyLength1D; ++i)
    {
        for(int j = 0; j < npyLength2D; ++j)
        {
            int nIndexJ = i * npyLength2D + j;
            // operate on array
            npyArray2D[nIndexJ];
        }
    }
}

.py文件:

def makeArray(rows, cols):
    return numpy.array(numpy.zeros(shape=(rows, cols)), dtype=numpy.int)

arr2D = makeArray(28, 28)
myModule.arrayFunction(arr2D)

相关问题 更多 >