python - 为什么我可以通过 f2py 调用 Fortran 子例程而没有正确数量的输入?
问题描述
我正在努力学习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
它是用 Python 编译f2py -c fibonacci.f -m fibonacci
并随后在 Python 中调用的
import numpy
import fibonacci
a = numpy.zeros(13)
fibonacci.fibonacci(a)
print a
在 Python 中调用的子例程fibonacci
没有获得足够数量的参数,但代码却神秘地工作了。顺便说一句,调用子程序fibonacci
也fibonacci.fibonacci(a, len(a))
有效!
有人可以解释一下吗?谢谢!
解决方案
f2py
知道a
andn
是函数参数,并且从声明中
double precision :: a(n)
它能够推断出n
是 的长度a
。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
thatn
应该是一个可选参数,其值不得超过 的长度,a
其默认值为len(a)
.
推荐阅读
- excel - 无法轮流产生“0 到 9”和“A 到 Z”
- r - 按组创建索引
- c# - C# 高级标签解析
- c# - 解析 vCard 文件
- python - 在受监控的训练会话中数据集迭代器初始化的 TensorFlow 错误
- android - deviceready 事件未在 Android 的 phonegap 中触发
- macos - 无法在 MacOS 上导入“org.openqa.selenium.chrome.ChromeDriver”
- python-3.x - 读取csv时出错
- maven - maven测试前后如何运行
- python-3.x - 我正在尝试使用 bash 脚本检查输入的系统密码是否正确,使用 subprocess()