2011-10-19 46 views
1

Simple wrapping of C code with cython的例子的numpy的网格评价C函数很好地描述如何评价用C语言编写从numpy的传递的阵列上的功能,并在numpy的阵列返回结果。使用用Cython

如何去做同样的事情,但返回一个二维数组?即我想评估一个由两个numpy数组定义的网格上的C函数,并将结果作为一个numpy二维数组返回。

这将是这样的(使用相同的功能,在上述的链接)。显然,一个不能使用双Z []现在,但我不知道如何将2D numpy的数组传递给C.

/* fc.cpp */ 
int fc(int N, const double a[], const double b[], double z[]) 
    { 
    for(int i = 0; i < N; i ++){ 
     for(int j = 0; j < N; j ++){ 
      z[i][j] = somefunction(a[i],b[j]); 
    } 
    return N; 
} 

这是原来的.pyx文件(见下文)。

import numpy as np 
cimport numpy as np 
cdef extern from "fc.h": 
    int fc(int N, double* a, double* b, double* z) # z = a + b 

def fpy(N, 
    np.ndarray[np.double_t,ndim=1] A, 
    np.ndarray[np.double_t,ndim=1] B, 
    np.ndarray[np.double_t,ndim=1] Z): 
    """ wrap np arrays to fc(a.data ...) """ 
     assert N <= len(A) == len(B) == len(Z) 
     fcret = fc(N, <double*> A.data, <double*> B.data, <double*> Z.data) 

    return fcret 

非常感谢。

回答

1

您可以使用一个二维矩阵正常的阵列。您只需要将该维度的长度赋予该函数。

在C文件做一些为: (现在z是长度为N * N的阵列)

int fc(int N, const double a[], const double b[], double z[]) 
{ 
    for(int i = 0; i < N; i++){ 
     for(int j = 0; j < N; j ++){ 
      z[(i*N)+j] = somefunction(a[i],b[j]); 
    } 
    return N; 
} 

在Python你需要做的是相同的,所以可以使用一个一维阵列与N * N个元素而不是2D矩阵。

更新3D情况下

(Z现在的长度为N * N * N阵列)

int fc(int N, const double a[], const double b[],const double c[], double z[]) 
{ 
    for(int i = 0; i < N; i++){ 
     for(int j = 0; j < N; j ++){ 
      for(int k = 0; k < N; k ++){ 
      z[((i*N)+j)*N+k] = somefunction(a[i],b[j],c[k]); 
    } 
    return N; 
} 
+0

感谢 - 这似乎是这样做的一个很好的方式。你有一个想法如何去传递> = 3维数组? –