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]])
我正在使用 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]])