我对使用带有新功能的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的经验,请分享如何调用.

推荐答案

你的例子对我很有用.你可能需要重新启动xmlyter.我猜您曾经有过这段代码的早期版本,其中indx不是OUT参数,而Xueyter仍然加载了这个版本.Python不会在成功加载更改的模块后重新加载它们.您应该try 重新启动您的Linux内核,并重新运行您的代码.

Python相关问答推荐

过载功能是否包含Support Int而不是Support Int?

从今天起的future 12个月内使用Python迭代

如何防止Plotly在输出到PDF时减少行中的点数?

Python plt.text中重叠,包adjust_text不起作用,如何修复?

numba jitClass,记录类型为字符串

如何找到满足各组口罩条件的第一行?

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

使用@ guardlasses. guardlass和注释的Python继承

Polars:用氨纶的其他部分替换氨纶的部分

django禁止直接分配到多对多集合的前端.使用user.set()

对象的`__call__`方法的setattr在Python中不起作用'

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

调用decorator返回原始函数的输出

基于行条件计算(pandas)

如何排除prefecture_related中查询集为空的实例?

如何在BeautifulSoup/CSS Select 器中处理regex?

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

用来自另一个数据框的列特定标量划分Polars数据框中的每一列,