看来我找到了解决方案。
首先,仅当将整数数组传递给 Fortran 子例程时才会引发报告的错误。当我使用默认的 Python int 和 float 时,整数值和实数数组(我想也是值)正确传递,而在 Fortran 中我将它们声明为 INTEGER*4 和 REAL*8。
但在整数数组的情况下,这不起作用。需要进行较小的更正,即 Python 中的整数数组应声明为(或转换为)np.int32 类型,并在 Fortran 子例程中声明为 INTEGER*4。
以下是在我的项目中有效的数组声明/转换示例。
Python:
import numpy as np
import Fortran_file
#.... some code
# variable "data" is integer 2-D array
data = data.astype(np.int32) # data.astype(int) gives error
data = np.asfortranarray(data)
array1 = np.zeros(5, dtype=np.int32, order='F') # dtype=int gives error
array2 = np.zeros(5, dtype=float, order='F')
ivalue = 2 # conversion to np.int32 is not needed
Fortran_file.Fortran_subroutine(data, ivalue, array1, array2)
Fortran:
SUBROUTINE Fortran_subroutine (matrix, value, array1, array2)
IMPLICIT NONE
INTEGER*4 :: matrix(:,:)
!f2py INTENT(INOUT) :: matrix(:,:)
INTEGER*4 :: value
!f2py INTENT(INOUT) :: value
INTEGER*4 :: array1(5)
!f2py INTENT(INOUT):: array1(5)
REAL*8 :: array2(5)
!f2py INTENT(INOUT) :: array2(5)
同样,这在 64 位操作系统上是有意义的。当我使用 32 位操作系统时,没有这些技巧,一切正常。
我没有尝试过其他数据类型。