f2py不会将维度(N,3)返回给python

时间:2015-02-16 14:01:03

标签: python f2py

我正在使用f2py而且我很困难。我在fortran中有一个函数:

!f90 
subroutine f( !args
implicit none; 

double precision, dimension(N, 3):: fMatrix; 
!f2py double precision, dimension(N,3), intent(out, c) :: fMatrix  
!Stuff happens here

end subroutine force 

我已经

f2py -c -m moduleName file.f90 

将其转换为python模块。它编译没有错误,python可以调用它。但是......可悲的是,它什么也没有回报。我认为使用

!f2py intent(out,c) fMatrix

应该将内存保存更改为python使用的类型并将fMatrix返回到python。但..

...
myf = fortranModule.f(args);
print myf

返回"无"。

我猜我做错了什么;我确实发现了一些关于fMatrix是N.3的事实,因此它确定返回类型有困难吗?

我尝试将意图(in)/ intent(out)添加到fortran变量声明中,但这在开始时提供了更多错误。但是,我刚刚再试一次; intent(in)声明正在工作,但intent(out)抛出:

double precision, dimension(N, 3), intent(out):: fMatrix;                                                         
Error: Symbol at (1) is not a DUMMY variable

我希望有人能给我答案, 提前谢谢!

2 个答案:

答案 0 :(得分:0)

此刻有点希望;我想我修好了。你需要有类似的东西:

subroutine f(inputA, inputB, output)

并将输出声明为intent(out)。至少,当我这样做时,它突然开始打印矩阵; - )

所以我检查了docstring:

Return objects:
    fmatrix : rank-2 array('d') with bounds (n,3)

右键!

谢谢,我与之交谈的看不见的人。

答案 1 :(得分:0)

我使用的是如下内容,我试图避免意图inout变量 因为我觉得它有时会被引用的东西混淆 相反,我在子程序本身中定义一个输出变量,它会自动返回

 subroutine f(fMatrix,oMatrix,N)
      implicit none; 
      integer,intent(in)::N
      double precision,intent(in),dimension(N, 3):: fMatrix
      double precision,intent(out),dimension(N, 3):: oMatrix
      !do stuff here with fMatrix
      !copy stuff to oMatrix using 
      oMatrix = fMatrix  
 end subroutine f

另存为“test.f90”,用

编译
f2py --f90exec=gfortran  -DF2PY_REPORT_ON_ARRAY_COPY=1 --noarch
--f90flags='-march=native' -m test -c test.f90

测试
In [6]: import test

In [7]: fmatrix = np.random.random((2,3))

In [8]: fmatrix Out[8]:  array([[ 0.19881303,  0.68857701, 
0.90133757],
       [ 0.92579141,  0.03823548,  0.98172467]])

In [9]: test.f(fmatrix) copied an array: size=6, elsize=8 Out[9]:  array([[ 0.19881303,  0.68857701,  0.90133757],
       [ 0.92579141,  0.03823548,  0.98172467]])