如何从python到C传递大小不同的数组列表?

时间:2019-01-15 20:35:47

标签: python c arrays list swig

在python(3.5)中,我有N个数组的列表,每个数组的大小不同。对于N = 2,例如:

v = [ np.array((0., 2., 4.)), np.array((0., 3.)) ]

N本身不是固定的。 从C我想访问列表的第i个元素的第n个元素。 v [0] [1] = 2。 作为从python到C的接口,我正在使用SWIG。

在C语言中,我的结构类似于:

struct timestamps
  {
     int N;
     double **a;
     int *lengths;
  };

其中N是列表中元素的数量。 我希望将其作为N个位置的数组,每个位置包含指向原始列表的第n个数组的指针。长度为N的数组,每个数组包含原始列表的第n个数组的长度。

例如在C语言中,我有一个函数可以简单地打印要访问的元素的值:

void print (int N, double **a, int *lenghts) {
    int i, j;
    struct timestamps T;
    T.N = N;
    T.a = a;
    T.lenghts = lenghts;
    for ( i = 0; i < T.N; i++ ) {
        for (j = 0, j < T.lenghts[i]; j++ ) {
            printf("%lf\t", *(T.a[i] + j));
        }
        printf("\n");
    }
}

我想从python脚本调用print并获取输出:

0.  2.  4.
0.  3.

我的问题是本机对象是在python中创建的numpy数组的列表。 最好的方法是什么? (我做了几次尝试,但它们都是基于c的,从某种意义上说,我试图在python中创建一个指针数组,就像我在C中所做的一样,但没有成功)

非常感谢您,我真的找不到任何“易于理解的C人物”参考资料...

1 个答案:

答案 0 :(得分:0)

为此,您需要一个接口帮助器功能。参见reference

    // Some array helpers
%inline %{
  /* Create any sort of [size] array */
  int *int_array(int size) {
     return (int *) malloc(size*sizeof(int));
  }
  /* Create a two-dimension array [size][10] */
  int (*int_array_10(int size))[10] {
     return (int (*)[10]) malloc(size*10*sizeof(int));
  }
%}

此外,您的a必须是一个锯齿状的数组,如下所示:

double *a[100];

a[0] = malloc(sizeof(double) * N1);
a[1] = malloc(sizeof(double) * N2);