如何在numpy的f2py中调用Fortran的FINDLOC

问题描述 投票:0回答:1

我对使用具有新功能的 Fortran 2008 版本相对较新。对于特定应用程序,使用 Fortran 中的

findloc
的能力将显着加快我的代码速度。 我正在尝试在 jupyter 笔记本单元中执行以下命令:

import numpy as np
import indexfinder

tstarr=np.array([1,3,2,4,10])
chk=2
indxval=0
arrayfort=np.zeros((1000000), dtype=int)
arrayfort[0:len(tstarr)]=tstarr
indxval=indexfinder.locindx(arrayfort,chk)

预期的正确结果将是 indxval=3(假设在 fortran 调用 locindx.f90 中数组索引将从 1 开始)。

我已经检查了我的 Fortran 编译器是否能够通过 Warrens 在这个 Stack Overflow 问题

中使用 findloc 执行脚本

我编写了以下名为 locindx.f90 的子例程:

SUBROUTINE locindx(indx, xarray, chkval) !RESULT(indx)

  IMPLICIT NONE
  INTEGER, DIMENSION(1000000), INTENT(IN) :: xarray
  INTEGER, INTENT(IN) :: chkval
  INTEGER, INTENT(OUT) :: indx
  
  indx = findloc(xarray,chkval,dim=1)
 
END SUBROUTINE locindx

并在我的 Python 虚拟环境(在 Ubuntu 22.04 中设置)中成功编译它(没有错误,没有警告),如下

(venv) MyPythonDirUbuntu$ python -m numpy.f2py -c locindx.f90 -m indexfinder

上面提到的 jupyter 笔记本单元返回以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[134], line 6
      4 arrayfort=np.zeros((1000000), dtype=int)
      5 arrayfort[0:len(tstarr)]=tstarr
----> 6 indxval=indexfinder.locindx(arrayfort,chk)

TypeError: indexfinder.locindx() missing required argument 'val' (pos 3)

尽管这个“语法”之前在这个环境中对其他 f90 子例程适用过。

我尝试将单元格运行为

import numpy as np
import indexfinder

tstarr=np.array([1,3,2,4,10])
chk=2
indxval=0
arrayfort=np.zeros((1000000), dtype=int)
arrayfort[0:len(tstarr)]=tstarr
indxval=indexfinder.locindx(indxval,arrayfort,chk)

在这种情况下,没有返回错误消息,但也没有返回

indexval
的值。 我检查了
type(indxval)
并得到了
NoneType
。 如果有人有在 Python 中成功调用 Fortran
findloc
的经验,请分享如何实现。

python numpy fortran gfortran f2py
1个回答
0
投票

你的例子对我有用。您可能需要重新启动 Jupyter。我猜您曾经拥有此代码的先前版本,其中

indx
不是 OUT 参数,并且 Jupyter 仍然加载了此版本。一旦成功加载更改的模块,Python 就不会重新加载它们。您应该尝试重新启动 Jupyter 内核,然后重新运行代码。

© www.soinside.com 2019 - 2024. All rights reserved.