使用f2py将numpy stringformat数组传递给fortran

2024-10-03 06:18:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是在fortran中从python numpy数组中打印第二个字符串,但我只打印第一个字符,而且它也不一定是正确的字符串。在

谁能告诉我什么是正确的方法来传递完整的字符串数组给fortran?

代码如下:

测试页.py

import numpy as np
import testa4

strvar = np.asarray(['aa','bb','cc'], dtype = np.dtype('a2'))
testa4.testa4(strvar)

testa4.f90

^{pr2}$

编译使用

f2py -c -m testa4 testa4.f90

以上代码的输出

c

期望输出

bb

Tags: 方法字符串代码importnumpy目标np数组
3条回答

我不知道如何使用f2py来实现这一点。但是可以用ctypes来完成。你可以得到一个字符数组,但是你可以很容易地把它转换成字符串。在

subroutine testa4(strvar) bind(C, name='testa4')
  use iso_c_binding
  implicit none

  character(len=1,kind=c_char), intent(in) :: strvar(2,3)

  print *, strvar(:,2)

end subroutine testa4

编译:gfortran -shared -fPIC testa4.f90 -o testa4.so

^{pr2}$

运行:

> python testpy.f90 
 bb

根据documentation,f2py喜欢使用dtype='c'(例如,'| S1')传递字符串数组。这让你有了一部分的方法,尽管在幕后对数组形状有一些奇怪的地方(例如,在我的很多测试中,我发现fortran会保持2个字符的长度,但将6个字符解释为表示2x6数组,因此我会在输出中重新获得随机内存)。这(据我所知)要求您将Fortran数组视为二维字符数组(而不是一维“字符串”数组)。不幸的是,我无法使它成形,最后将字符串的数量作为参数传入。在

我很确定我遗漏了一些相当明显的东西,但这暂时应该行得通。至于为什么CHARACTER*2不起作用。。。我真的不知道。在

MODULE char_test

CONTAINS

SUBROUTINE print_strings(strings, n_strs)
    IMPLICIT NONE

    ! Inputs
    INTEGER, INTENT(IN) :: n_strs
    CHARACTER, INTENT(IN), DIMENSION(2,n_strs) :: strings

!f2py INTEGER, INTENT(IN) :: n_strs
!f2py CHARACTER, INTENT(IN), DIMENSION(2,n_strs) :: strings

    ! Misc.
    INTEGER*4 :: j


    DO j=1, n_strs
        WRITE(*,*) strings(:,j)
    END DO

END SUBROUTINE print_strings

END MODULE char_test

        

import numpy as np
import char_test as ct

strings = np.array(['aa', 'bb', 'cc'], dtype='c').T
ct.char_test.print_strings(strings, strings.shape[1])

strings = np.array(['ab', 'cd', 'ef'], dtype='c').T
ct.char_test.print_strings(strings, strings.shape[1]) 

 >python run_char_test.py
 aa
 bb
 cc
 ab
 cd
 ef

这不是一个真正的答案,但太长的时间来评论:也许这有帮助。。在

在第一种情况下,由于某种原因,传入fortran的是每个字符串的第一个字符:

'abc'

在fortran中,它在长度为2的数组中结束为“ab”、“c”。如果严格使用长度为一个字符串的数组,我想一切都是好的。不幸的是,在python ['a','a','b','b'..中不能伪造系统并拆分成单个字符数组——如果数组长度不匹配,则会抛出错误。在

关于你的第二个问题,如果你用

^{pr2}$

notation,它实际上只是传递一个常规的python字符串列表:

  testa4.testa4(['aa','bb','cc'])

(如果您尝试numpy字符串数组,则会抛出一个错误。)。字符串的长度必须准确无误,否则也会在此处引发错误。在

相关问题 更多 >