zyy*_*zyy 5 python fortran f2py
所以我试图学习,f2py并且我有以下Fortran代码
subroutine fibonacci(a, n)
implicit none
integer :: i, n
double precision :: a(n)
do i = 1, n
if (i .eq. 1) then
a(i) = 0d0
elseif (i .eq. 2) then
a(i) = 1d0
else
a(i) = a(i - 1) + a(i - 2)
endif
enddo
end subroutine fibonacci
Run Code Online (Sandbox Code Playgroud)
用f2py -c fibonacci.f -m fibonacciPython 编译并调用
subroutine fibonacci(a, n)
implicit none
integer :: i, n
double precision :: a(n)
do i = 1, n
if (i .eq. 1) then
a(i) = 0d0
elseif (i .eq. 2) then
a(i) = 1d0
else
a(i) = a(i - 1) + a(i - 2)
endif
enddo
end subroutine fibonacci
Run Code Online (Sandbox Code Playgroud)
fibonacciPython中调用的子例程没有获得足够数量的参数,但是该代码神秘地起作用了。顺便说一句,调用子程序fibonacci有fibonacci.fibonacci(a, len(a))同样适用!
谁能解释一下吗?谢谢!
f2py从声明中知道a并且n是函数参数
double precision :: a(n)
Run Code Online (Sandbox Code Playgroud)
它能够推断出n的长度a。NumPy数组具有长度,因此n在Python包装器中不需要该参数,并将f2py其设为可选。
请注意,由f2py检查生成的代码没有给出值,该代码n太大:
In [19]: a = np.zeros(10)
In [20]: fibonacci.fibonacci(a, 99)
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-20-e9497469fd10> in <module>()
----> 1 fibonacci.fibonacci(a, 99)
error: (len(a)>=n) failed for 1st keyword n: fibonacci:n=99
Run Code Online (Sandbox Code Playgroud)
您可以提供较小的值:
In [21]: a = np.zeros(10)
In [22]: fibonacci.fibonacci(a, 6)
In [23]: a
Out[23]: array([0., 1., 1., 2., 3., 5., 0., 0., 0., 0.])
Run Code Online (Sandbox Code Playgroud)
您可能会发现生成并查看f2py为此功能生成的接口文件很有用。命令
f2py -h fibonacci.pyf fibonacci.f
Run Code Online (Sandbox Code Playgroud)
显示
Reading fortran codes...
Reading file 'fibonacci.f' (format:fix,strict)
Post-processing...
Block: fibonacci
Post-processing (stage 2)...
Saving signatures to file "./fibonacci.pyf"
Run Code Online (Sandbox Code Playgroud)
并生成文件fibonacci.pyf,其中包含
! -*- f90 -*-
! Note: the context of this file is case sensitive.
subroutine fibonacci(a,n) ! in fibonacci.f
double precision dimension(n) :: a
integer, optional,check(len(a)>=n),depend(a) :: n=len(a)
end subroutine fibonacci
! This file was auto-generated with f2py (version:2).
! See http://cens.ioc.ee/projects/f2py2e/
Run Code Online (Sandbox Code Playgroud)
您可以从生成的声明中看到
integer, optional,check(len(a)>=n),depend(a) :: n=len(a)
Run Code Online (Sandbox Code Playgroud)
这f2py已推断,n应该是一个可选的参数,其值不能超过的长度a和其默认值len(a)。