将Fortran复数编号读入Python

时间:2016-01-19 16:48:29

标签: python numpy fortran

我试图将复杂数字的文件(使用Fortran生成)读入Python。

说,使用a = f1.readline().split( )后,我得到a的以下值:

a = ['(4.471719725275173E-003,2.163649191486555E-002)']

如果我这样做

b = np.complex(a[0])

它会产生错误

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-cff25069e279> in <module>()
----> 1 b = np.complex(a[0])

ValueError: complex() arg is a malformed string

我试图基于numpy似乎支持Fortran表示法(Reading fortran double precision format into python)的事实来做到这一点。是否有复数的等价函数?

如果没有,那么最好的方法是什么(而不是在split( )调用中使用不同的分隔符并手动重建复数)。

2 个答案:

答案 0 :(得分:2)

您可以通过这种方式解析它(https://stackoverflow.com/a/9763133/721644):

from ast import literal_eval

t = literal_eval(a[0])

b = complex(t[0], t[1])

>(0.004471719725275173+0.02163649191486555j)

它首先创建一个浮点元组,然后将其组件用作complex()的参数。

答案 1 :(得分:1)

textView.setOnClickListener(new Button.OnClickListener() {  
        public void onClick(View v)
            {
                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(textView.getText().toString()));
                startActivity(browserIntent);
            }
         });

如果您正在阅读文件并想要一个数组:

import numpy as np
a = ['(4.471719725275173E-003,2.163649191486555E-002)']
i, j = np.safe_eval(a[0])

print(np.complex(i, j))
(0.004471719725275173+0.02163649191486555j)

输出:

import numpy as np



def to_complex(f):
    conv = lambda x: np.complex(*np.safe_eval(x))
    return np.genfromtxt(f, converters={0: conv})

或者,如果您一次只想要一个值:

In [3]: cat out.txt
(4.471719725275173E-003,2.163649191486555E-002)
(6.471719725275173E-003,2.163649191486555E-002)
In [4]: print(to_complex("out.txt"))
[ 0.00447172+0.02163649j  0.00647172+0.02163649j]

输出:

from itertools import imap
def to_complex(f):
    with open(f) as fle:
        for a, b in imap(np.safe_eval, fle):
            yield np.complex(a, b)

你也可以自己剥离和拆分数据,这比使用safe_eval更快:

In [7]: print(list(to_complex("out.txt")))
[(0.004471719725275173+0.02163649191486555j), (0.006471719725275173+0.02163649191486555j)]

您可以在from itertools import imap def to_complex(f): with open(f) as fle: for tup in imap(str.strip, fle): yield np.complex(*map(float, tup.strip("()").split(","))) 中使用相同的逻辑:

来自itertools import imap

genfromtxt