F2py

日期2011-11-10(最后修改),2006-02-24(创建)

此页面提供有关如何使用 F2py Fortran 包装程序的示例。

可以从简单的例程开始,甚至可以包装完整的 Fortran 模块。 F2py 用于 SciPy 本身,您可以在 SciPy 源代码中找到一些示例。

简短示例

包装来自 lapack 的函数

摘自 ArndBaecker 于 2006-06-22 在 scipy-user 上发布的消息

感谢 f2py,在许多情况下,包装 Fortran 代码(经过一些努力)是微不足道的。对于需要许多参数的复杂函数,包装器可能会变得很长。幸运的是,从 ``scipy/Lib/linalg/generic_flapack.pyf`` 中可以学到很多东西。特别是,http://cens.ioc.ee/projects/f2py2e/ 上的文档非常出色。我还发现 FernandoPerez 的 f2py 笔记非常有用,http://cens.ioc.ee/pipermail/f2py-users/2003-April/000472.html

让我尝试给出一些关于如何开始的一般性说明(所有这些的真正权威当然是 Pearu,所以如果我在这里弄错了,请纠正我):* 首先找到一个可以完成您想要工作的例程:* 如果 lapack 文档在 Linux 上正确安装,您可以执行 * http://www.netlib.org/ 提供了一个不错的决策树 * 确保它不存在于 scipy 中

在 [ ]
from scipy.lib import lapack
  lapack.clapack.<TAB>         (assuming Ipython)
  lapack.clapack.<routine_name>

备注:以 c/z 开头的例程用于双精度/单精度复数\ 而 d/s 例程用于双精度/单精度实数。\ c/z 和 d/s 的调用顺序(我认为总是)相同,并且\ 有时它们在实数和复数情况下也相同。\ * 然后需要下载感兴趣的 lapack 例程的 fortran 文件。\ * 通过调用生成包装器\

* 生成库\

* 可以通过以下方式使用

在 [ ]
import wrap_lap

注意,这还没有完善(这是需要花些功夫的部分 ;-)),即需要\ 说明哪些变量是输入,哪些是输出\ 哪些是可选的。此外,还需要提供具有正确维度的临时\ 存储空间,如 lapack 例程的文档部分所述。

具体(非常简单)示例(非 lapack)

包装 Hermite 多项式

下载代码(在几个小时的谷歌搜索后找到 ;-),来自 http://cdm.unimo.it/home/matematica/funaro.daniele/splib.txt

并提取

生成包装器框架

# only run the following line _once_
# (and never again, otherwise the hand-modified hermite.pyf
#  goes down the drains)
f2py -m hermite -h hermite.pyf hermite.f

然后修改

创建模块

f2py -c hermite.pyf  hermite.f

# add this if you want:
-DF2PY_REPORT_ON_ARRAY_COPY=1 -DF2PY_REPORT_ATEXIT

简单测试

在 [ ]
import hermite
hermite.vahepo(2,2.0)
import scipy
scipy.special.hermite(2)(2.0)

有关如何包装带状矩阵例程的更复杂示例,请参见 http://www.physik.tu-dresden.de/~baecker/comp_talks.html 中的“Python and Co - some recent developments”。

包装简单的 C 代码

f2py 也能够处理 C 代码。示例可以在维基百科上找到:["Cookbook/f2py_and_NumPy"]。

逐步包装简单的数值代码:交互式冰盖模拟系统

http://websrv.cs.umt.edu/isis/index.php/F2py_example

章节作者:DavidCooke、mauro、Pierre_deBuyl