从python调用用f2py包装的C函数,并返回不同大小的数组

时间:2019-09-07 16:42:57

标签: python c f2py

我试图通过使用f2py来包装从python用C编写的函数。我遇到了麻烦,因为我无法返回大小与输入数组不同的数组(它们都是python端的numpy数组)

我试图通过使用f2py来包装从python用C编写的函数。从python的角度来看,我有一个维数为n的浮点数(命名为x)的一维numpy数组(确保它是连续的),并分配了另一个维数为m的一维数组,其中m与n不同,我们将其称为y。

现在,此示例中的C函数接受输入x,并且应返回y(在现实生活中,这是一个非常讨厌的循环)。我在这里遇到了麻烦,因为返回不同大小的输入数组似乎是有问题的。我在这里列出了我最初的尝试,但失败了,并且成功了。在此尝试中,所有工作都可以进行,但要以创建另一个数组为代价(由于实际情况中的维数很大,因此必须避免这样做)。我使用的是python2.7,而且我不是C语言的专家,所以我可能在做一些愚蠢的事情或缺少明显的解决方案。

失败尝试的

C代码,在循环中我做了很多工作。这就是我想做的。

void foo(int n, int m, double *x, double *y,  int d1, int d2, int d3) {
  int i;
  for (i=0;i<m;i++) {
      y[i] = 0.;
      }
}

用于f2py的界面

python module m2
interface
  subroutine foo(n,m,x,y, d1, d2, d3)
    intent(c) foo
    intent(c)

    integer intent(in), depend(x) :: n=len(x)
    integer intent(in), depend(y) :: m=len(y)

    double precision intent(in) :: x(n)

    double precision intent(out) :: y(m)

    integer intent(in) :: d1, d2, d3
  end subroutine foo
end interface
end python module m2

调用该函数的python代码

x = np.linspace(10,10,10) # just some values for the example
y = np.ones(4)            # this should be the output array
print m2.foo(x,1,2,3)

返回ValueError: failed to create intent(cache|hide)|optional array-- must have defined dimensions but got (-1,)。在y的intentinout的情况下,不会修改y数组。

这是成功尝试的C代码,我添加了一个具有y相同维度但带有intent(in)的数组作为输入。

void foo(int n, int m, double *x,double *z, double *y,  int d1, int d2, int d3) {
  int i;
  for (i=0;i<m;i++) {
      y[i] = 0.;
      }
}

它是f2py的界面

python module m2
interface
  subroutine foo(n,m,x,z,y, d1, d2, d3)
    intent(c) foo
    intent(c)

    integer intent(in), depend(x) :: n=len(x)
    integer intent(in), depend(z) :: m=len(z)

    double precision intent(in) :: x(n)
    double precision intent(in) :: z(m)

    double precision intent(out) :: y(m)

    integer intent(in) :: d1, d2, d3
  end subroutine foo
end interface
end python module m2

调用该函数的python代码

x = np.linspace(10,10,10) # just some values for the example
y = np.ones(4)            # this should be the output array
z = np.ones_like(y)       # an unused array that makes everything work
print m2.foo(x,z,1,2,3)

似乎输入中仅存在z数组(没有提示)就解决了问题。在没有z数组的情况下该如何工作?

非常感谢, 安德里亚

0 个答案:

没有答案