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

2 投票
1 回答
4535 浏览
提问于 2025-04-18 12:46

我第一次使用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
...

撰写回答