f2py 不 return 维度 (N,3) 到 python

f2py does not return dimension(N,3) to python

我正在使用 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 可以调用它。但是...可悲的是,它 return 没什么。我认为使用

!f2py intent(out,c) fMatrix

应该将内存节省更改为 python 使用的类型,并且 return 将 fMatrix 更改为 python。但是..

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

Returns"None"。

我猜我做错了什么;我发现的一些点击提到了 fMatrix 是 N.3 的事实,因此它无法确定 return 类型?

我试过将 intent(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

我希望有人能为我解答, 提前致谢!

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

subroutine f(inputA, inputB, output)

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

所以我检查了文档字符串:

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

没错!

谢谢,我正在与之交谈的隐形人。

我使用的是下面的东西,我尽量避免使用 intent inout 变量 因为我发现它有时会与引用调用混淆 相反,我在子例程本身中定义了一个输出变量,它会自动 returns that

 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]])