使用f2py从Fortran修改Numpy字符串数组

时间:2018-07-21 14:35:30

标签: python string numpy fortran f2py

我正在尝试通过使用包装f2py来修改Fortran代码中的Numpy字符串数组的内容。我总是有错误:

ValueError: Failed to initialize intent (inout) array -- input 'c' not compatible to c.

这是我的代码:

module1.f90

    module module1
    implicit none
    contains

    subroutine sub1(ddtype,nstr)
        integer,intent(in)::nstr
        character,intent(inout),dimension(2,nstr)::ddtype
        !f2py integer,intent(in)::nstr
        !f2py character,intent(inout),dimension(2,nstr)::ddtype

        ddtype(1,1) = 'X'
        write(*,*) 'From Fortran: ',ddtype
    end subroutine sub1
    end module module1

python测试: testPython.py

    import numpy as np
    import Test

    arg1 = np.array(['aa','bb','cc'],dtype='c').T

    Test.module1.sub1(arg1,arg1.shape[1])
    print arg1

我在Linux CentOS 7中,并使用gfortran,f2py和Python 2.7。 我使用以下方法进行编译:

f2py -c -m Test module1.f90

仅当将intent (inout)更改为(in)时,才能打印NumPy字符串数组。通常,带有字符串数组的f2py行为似乎不清楚/稳定。

1 个答案:

答案 0 :(得分:1)

我以最明显的方式从question I already linked修改了示例,并且效果很好:

subroutine testa4(strvar) bind(C)
  use iso_c_binding
  implicit none

  character(len=1,kind=c_char), intent(inout) :: strvar(2,3)
  !character*2 does not work here - why?

  strvar(:,1) = ["a", "b"]
  strvar(:,2) = ["c", "d"]
  strvar(:,2) = ["e", "f"]

end subroutine testa4

编译:

gfortran -shared -fPIC testa5.f90 -o testa5.so

import numpy as np
import ctypes

testa4 = ctypes.CDLL("./testa5.so")

strvar = np.asarray(['aa','bb','cc'], dtype = np.dtype('a2'))
strvar_p = ctypes.c_void_p(strvar.ctypes.data)

testa4.testa4(strvar_p)

print(strvar)

运行

   > python test.py
['ab' 'ef' 'cc']

f2py当时对我不起作用,所以我什至现在都没有去尝试它。我确实尝试调整AMacK的f2py答案,但遇到了同样的错误。我只会使用ctypes。