2016-01-19 46 views
2

我試圖用複雜的數字讀入一個文件(用Fortran生成)到Python中。將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()

+0

謝謝!簡單而有效。 – Nigu

1
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] 

或者,如果你只是想在一個時間值:

輸出:

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

你也可以只投自己剝的數據和分裂這將是比使用safe_eval快:

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(","))) 

您可以用genfromtxt使用相同的邏輯:

從itertools進口imap

def to_complex(f): 
    conv = lambda x: np.complex(*imap(float, x.strip("()").split(","))) 
    return np.genfromtxt(f, converters={0: conv}) 
+0

非常完整的答案。將保留以備將來參考... – Nigu