我对使用具有新功能的 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
的经验,请分享如何实现。
你的例子对我有用。您可能需要重新启动 Jupyter。我猜您曾经拥有此代码的先前版本,其中
indx
不是 OUT 参数,并且 Jupyter 仍然加载了此版本。一旦成功加载更改的模块,Python 就不会重新加载它们。您应该尝试重新启动 Jupyter 内核,然后重新运行代码。