F2PY。传递数组。 “未能将mga.init的第二个参数`xmin'转换为C / Fortran数组”

时间:2014-07-10 09:34:35

标签: python arrays fortran f2py

我第一次使用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应该是“低”矢量尺寸的上限。

我做错了什么?

1 个答案:

答案 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
...