我的目标是在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
我不知道如何使用
f2py
来实现这一点。但是可以用ctypes
来完成。你可以得到一个字符数组,但是你可以很容易地把它转换成字符串。在编译:
^{pr2}$gfortran -shared -fPIC testa4.f90 -o testa4.so
运行:
根据documentation,f2py喜欢使用dtype='c'(例如,'| S1')传递字符串数组。这让你有了一部分的方法,尽管在幕后对数组形状有一些奇怪的地方(例如,在我的很多测试中,我发现fortran会保持2个字符的长度,但将6个字符解释为表示2x6数组,因此我会在输出中重新获得随机内存)。这(据我所知)要求您将Fortran数组视为二维字符数组(而不是一维“字符串”数组)。不幸的是,我无法使它成形,最后将字符串的数量作为参数传入。在
我很确定我遗漏了一些相当明显的东西,但这暂时应该行得通。至于为什么CHARACTER*2不起作用。。。我真的不知道。在
这不是一个真正的答案,但太长的时间来评论:也许这有帮助。。在
在第一种情况下,由于某种原因,传入fortran的是每个字符串的第一个字符:
在fortran中,它在长度为2的数组中结束为“ab”、“c”。如果严格使用长度为一个字符串的数组,我想一切都是好的。不幸的是,在python
['a','a','b','b'..
中不能伪造系统并拆分成单个字符数组——如果数组长度不匹配,则会抛出错误。在关于你的第二个问题,如果你用
^{pr2}$notation,它实际上只是传递一个常规的python字符串列表:
(如果您尝试numpy字符串数组,则会抛出一个错误。)。字符串的长度必须准确无误,否则也会在此处引发错误。在
相关问题 更多 >
编程相关推荐