我对使用带有新功能的Fortran 2008版本比较陌生.对于特定的应用程序,从Fortran中使用findloc
的能力将显著加快我的代码速度.
我正try 在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编译器是否能够在这Stack Overflow question中使用findloc执行脚本
我编写了名为Locindx.f90的以下子 routine ,如下所示:
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子 routine .
我试着以
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
的经验,请分享如何调用.