我试图将复杂数字的文件(使用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( )
调用中使用不同的分隔符并手动重建复数)。
答案 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