Python 用Cython在numpy网格上求C函数

Python 用Cython在numpy网格上求C函数,python,numpy,cython,Python,Numpy,Cython,中的示例很好地描述了如何在从numpy传递的数组上计算用C编写的函数,并在numpy数组中返回结果 如何做同样的事情,但返回一个二维数组?也就是说,我想在由两个numpy数组定义的网格上计算一个C函数,并将结果作为numpy 2D数组返回 它应该是这样的(使用与上面链接中相同的函数)。显然现在不能使用double z[],但我不知道如何将2D numpy数组传递给C /* fc.cpp */ int fc( int N, const double a[], const double b[

中的示例很好地描述了如何在从numpy传递的数组上计算用C编写的函数,并在numpy数组中返回结果

如何做同样的事情,但返回一个二维数组?也就是说,我想在由两个numpy数组定义的网格上计算一个C函数,并将结果作为numpy 2D数组返回

它应该是这样的(使用与上面链接中相同的函数)。显然现在不能使用double 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;
}
/*fc.cpp*/
int fc(int N,常数双a[],常数双b[],双z[]
{
对于(int i=0;i
这是原始的.pyx文件(见下文)

将numpy导入为np
cimport numpy作为np
“fc.h”中的cdef外部:
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):
“”“将np阵列包装到fc(a.data…)”“”

assert N您可以对2D矩阵使用普通数组。您只需要为函数提供维度的长度

在C文件中,执行如下操作: (z现在是长度为N*N的数组)

intfc(intn,常数双a[],常数双b[],双z[]
{
对于(int i=0;i
在Python中,您也需要这样做,因此可以使用具有N*N个元素的1D数组,而不是2D矩阵

更新3D案例

(z现在是长度为N*N*N的数组)

intfc(intn,常数双a[],常数双b[],常数双c[],双z[]
{
对于(int i=0;i
您可以对2D矩阵使用普通数组。您只需为函数提供维度的长度

在C文件中,执行如下操作: (z现在是长度为N*N的数组)

intfc(intn,常数双a[],常数双b[],双z[]
{
对于(int i=0;i
在Python中,您也需要这样做,因此可以使用具有N*N个元素的1D数组,而不是2D矩阵

更新3D案例

(z现在是长度为N*N*N的数组)

intfc(intn,常数双a[],常数双b[],常数双c[],双z[]
{
对于(int i=0;i
谢谢-这似乎是一种很好的方法。你知道如何传递>=三维数组吗?谢谢-这似乎是一种很好的方法。你知道如何传递>=三维数组吗?
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
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;
}
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;
}