为什么我可以通过f2py调用Fortran子程序而没有正确的输入数?

2024-04-23 18:19:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力学习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

它是用f2py -c fibonacci.f -m fibonacci编译的,后来在Python中调用

import numpy
import fibonacci

a = numpy.zeros(13)
fibonacci.fibonacci(a)
print a

Python中调用的子例程fibonacci没有获得足够数量的参数,但代码神秘地工作。顺便说一下,用fibonacci.fibonacci(a, len(a))调用子例程fibonacci也可以

有人能解释一下吗?谢谢


Tags: 代码importnumpynoneinteger例程precisionfibonacci
1条回答
网友
1楼 · 发布于 2024-04-23 18:19:50

f2py知道an是函数参数,并且从声明中可以看出

double precision :: a(n)

可以推断na的长度。NumPy数组有一个长度,因此Python包装器中不需要参数n,并且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

您可以给出较小的值:

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

您可能会发现生成并查看f2py为该函数生成的接口文件很有用。命令

f2py -h fibonacci.pyf fibonacci.f

显示

Reading fortran codes...
    Reading file 'fibonacci.f' (format:fix,strict)
Post-processing...
    Block: fibonacci
Post-processing (stage 2)...
Saving signatures to file "./fibonacci.pyf"

并生成文件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/

您可以从生成的声明中看到

    integer, optional,check(len(a)>=n),depend(a) :: n=len(a)

f2py已推断n应为可选参数,其值不得超过a的长度,其默认值为len(a)

相关问题 更多 >