2017-11-11 5 views
3

私はnumpy配列に読みたいデータがあります。データは文字列形式です。 1行の形式は文字列に結合された負の科学的書式番号を解析します。

' 0.600759893E-02 0.000000000E+00-0.112325850E-02 0.000000000E+00 0.000000000E+00' 

です。文字列を5つの別々の番号に解析したいと思います。すべての数字の間にスペースがあれば、これは簡単です。残念ながら、負の数の場合は、負の数と前の数の間にスペースがないので、より難しくなります。マイナス記号は、負の数の前に表示されるだけではありません。時には、指数が負の値になる場合もあります。上記のような行を5つの別々の数に解析する高速な方法はありますか?ここで

は、私は現在、上記のコードは、前述した理由は、マイナス記号の問題のいくつかのケースで失敗し

import pandas as pd 
data1 = pd.read_csv('datafile.csv') 
dim1 = 5 
geometryparameters = np.zeros(dim1,dtype=float) 

c=data1.iloc[1,0] # Just taking the first row, which is in string format 
csplit = c.split(" ") # Splitting the string into parts 
for it1 in np.arange(dim1): 
    geometryparameters[it1] = float(csplit[it1]) # converting the string into float 

持っているコードのMWEです。

+0

それはあなたがしようとしたコードとその出力を含めるために常に最善です:

したがって、各ラインのために、xは5個の数字のリストになります。さもなければ、人々はこれを、あなたのためにあなたのコードを書く人を探していると解釈するかもしれません。 – Mark

答えて

3

数は常にE+/-xxで終わるので、あなたは、入力は固定していない場合は、あなたがこのパターンに遭遇したとき、あなたは(正規表現を使用して)スペースを挿入することができ、その後、floatに&変換を分割:

import re 

s = ' 0.600759893E-02 0.000000000E+00-0.112325850E-02 0.000000000E+00 0.000000000E+00' 

result = [float(x) for x in re.sub("(E[+\-]\d\d)",r"\1 ",s).split()] 

print(result) 

(キャプチャとE<sign> and 2 digitsを検索し、同じこと(\1)を加えたスペースで置き換え

収量:。

[0.00600759893, 0.0, -0.0011232585, 0.0, 0.0] 

EDIT:さらに高速な正規表現とfindallだけで、無str.split

result = [float(x) for x in re.findall(r"\b.*?E[+\-]\d\d",s)] 

は(左のワード境界に注意してください非貪欲またはそれ以上1番号と一致します)単語を検索し、右側の指数表現。

+0

'' \ 1 ''の役割について簡単な説明を追加すると、この回答が完璧になります。 – PhillipD

+1

@PhillipD編集。しかし、 're.findall'の亜種はIMHOが良いです。 –

2

あなたの情報から、各番号フィールドは正確に16文字の長さです。したがって、各行の長さは80文字です。

x = [float(line[n:n+16]) for n in range(0,80,16)] 
関連する問題