F2PY. 传递数组。“将mga.init的第二个参数`xmin`转换为C/Fortran数组失败”
我第一次使用F2PY。我的FORTRAN程序大概是这样的:
SUBROUTINE init(ranMatr,low,upp,nbvar,size)
IMPLICIT NONE
INCLUDE 'parameter.h'
DOUBLE PRECISION ranMatr(dimpop,dim), low(dim), upp(dim),sigma
INTEGER k, j, nbvar,size
CF2PY intent(in) low, upp, nbvar, size
CF2PY intent(in,out) ranMatr
DO k = 1, size
DO j = 1, nbvar
CALL uniforme(1,sigma)
ranMatr(k,j) = low(j) + sigma * (upp(j) - low(j))
ENDDO
ENDDO
RETURN
END
这个程序主要是初始化一个叫“ranMatr”的随机矩阵,里面的值在“low”和“upp”定义的范围内。Uniforme是一个返回均匀分布值的程序。
现在,我安装了numpy和f2py,并尝试用这段代码进行测试。
我创建Python输入的方式如下:
ranMatr = [[0 for col in range(0, 5)] for row in range(0,10)]
low = numpy.array([1,2,3,4,5])
upp = numpy.array([6,7,8,9,10])
然后我尝试运行这个程序:
init(ranMatr, low, upp, 5, 20)
但是我总是收到这个错误信息:
0-th dimension must be fixed to 100 but got 5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
mga.error: failed in converting 2nd argument `low' of mga.init to C/Fortran array
我想问题可能出在维度上,但我理解dim
应该是“low”向量维度的上限。
我哪里做错了呢?
1 个回答
0
你需要传入一个名为 low
的数组,数组的维度要按照错误信息中说明的 dim
来设置。你可以在这里找到一些相关的信息,具体在“2”这一点上。或者你也可以直接使用 size
来代替 dim
:
SUBROUTINE init(ranMatr,low,upp,nbvar,size)
...
INTEGER k, j, nbvar,size
DOUBLE PRECISION ranMatr(dimpop,size), low(size), upp(size),sigma
...