2011-10-19 51 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維數組? –