我试图通过使用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的intent
为inout
的情况下,不会修改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数组的情况下该如何工作?
非常感谢, 安德里亚