gpt4 book ai didi

python - 为什么我可以在没有正确数量输入的情况下通过 f2py 调用 Fortran 子例程?

转载 作者:太空狗 更新时间:2023-10-30 01:04:18 24 4
gpt4 key购买 nike

我正在尝试学习 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 也有效!

有人可以解释一下吗?谢谢!

最佳答案

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

double precision :: a(n)

它能够推断出na的长度。 NumPy 数组有长度,因此在 Python 包装器中不需要参数 nf2py 使其成为可选参数。

请注意,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 为此函数生成的接口(interface)文件很有用。命令

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)

关于python - 为什么我可以在没有正确数量输入的情况下通过 f2py 调用 Fortran 子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55154634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com