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"]。
逐步包装简单的数值代码:交互式冰盖模拟系统¶
章节作者:DavidCooke、mauro、Pierre_deBuyl