我第一次使用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
应该是“低”矢量尺寸的上限。
我做错了什么?
答案 0 :(得分:0)
您必须按照错误消息中的指定传递low
数组,其维度为dim
。
这里可以找到一些information,点“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
...