2016-12-12 2 views
0

私は科学的な表記法で表現された科学的データを持つファイルを持っています。数字の6行の常に束が一緒に表示される場所フォーマットは以下に示すようにIフォームに上記のうち、(Pythonで)行列を構築しようとしていデータのリストから空行列で区切られた行列オブジェクトを作成する

4.748257444721457E-004  
-4.058788876602824E-006  
-1.494658656964534E-004  
    4.686186383664201E-006  
    3.840708360798801E-006  

-3.237680480600605E-005 
-3.237680480600605E-005 
5.290165586028430E-005 
-1.312378015891650E-005 
-9.693957759497108E-006 
3.184131106435972E-005 

、以下れます。

4.748257444721457E-004  -3.237680480600605E-005 
-4.058788876602824E-006  5.290165586028430E-005 
-1.494658656964534E-004  -1.312378015891650E-005 
    4.686186383664201E-006  -9.693957759497108E-006 
    3.840708360798801E-006  3.184131106435972E-005 

私は、行列のような構成がPythonで可能なのかどうか疑問に思っています(さらに数学的分析に使用できます)?


私はこのアプローチを試しました。

数値を10進数に変換し、bashスクリプトを使用して行列を作成し、次にpythonでtxtとして読み込みます。

しかし、私は浮動小数点数(精度の低下を引き起こす)を取り除きたくないので、この行列を生成するループアプローチを考えています。実際のデータセットは54×54の値を持ちます。

+0

ことが容易に可能です。リストに90個の要素がある場合、マトリックスに期待される次元は?ところで、あなたはこれを達成しようとしましたか?あなたの努力を示してください。 –

+0

あなたの質問に対する正確な答えは、 "はい、可能です"です。これはおそらくあなたが探していた答えではありません。テキストファイルを解析して行列を作成する方法はたくさんあります。より良い答えを得るために、これまで試みてきたアプローチの具体的な問題について質問したいと思うかもしれません。 – kazemakase

答えて

1

お手伝いがあります。

import numpy as np 

matrix = [] 
row = [] 
with open("input.txt") as f: 
    for line in f: 
     line = line.rstrip('\n') 
     if not line: 
      if len(row) != 0: 
       matrix.append(row) 
      row = [] 
      continue 
     row.append(float(line)) 

if len(row) != 0: 
    matrix.append(row) 

matrix = np.asarray(matrix).T 
print(matrix) 

それは印刷されます。

[[ 4.74825744e-04 -3.23768048e-05] 
[ -4.05878888e-06 -3.23768048e-05] 
[ -1.49465866e-04 5.29016559e-05] 
[ 4.68618638e-06 -1.31237802e-05] 
[ 3.84070836e-06 -9.69395776e-06] 
[ 3.84070836e-06 3.18413111e-05]] 

ます。また、行と列を反復処理することにより、マトリックスを印刷することができます。

for row in range(matrix.shape[0]): 
    for column in range(matrix.shape[1]): 
     print(matrix[row][column], end=' ') 
    print() 

それは印刷されます。

0.000474825744472 -3.2376804806e-05 
-4.0587888766e-06 -3.2376804806e-05 
-0.000149465865696 5.29016558603e-05 
4.68618638366e-06 -1.31237801589e-05 
3.8407083608e-06 -9.6939577595e-06 
3.8407083608e-06 3.18413110644e-05 

あなたはまた、科学的な形式で正確に印刷することができます。

print('{:.4e}'.format(matrix[row][column]), end=' ') 

入力ファイルは - input.txtは含まれています

4.748257444721457e-004 
-4.058788876602824e-006 
-1.494658656964534e-004 
4.686186383664201e-006 
3.840708360798801e-006 
3.840708360798801e-006 

-3.237680480600605e-005 
-3.237680480600605e-005 
5.290165586028430e-005 
-1.312378015891650e-005 
-9.693957759497108e-006 
3.184131106435972e-005 
+0

ありがとうございます。私が試している間にもう一度間違いをしたことを知ったところで、 'E-001'は' e-001'と違って文字列として表示されます!まだ学んでいる。 :-) – ankit7540

+0

@ ankit7540いいえ、 'e'や' E'は関係ありません。印刷すると 'e'が出力されますが、入力の場合は' e'と 'E'の両方が正常に動作します。混乱しないでください。 –

+1

私は参照してください。おそらく、各数値の前のスペースは、 'ValueError:文字列を浮動小数点に変換できませんでした: 'というエラーを出す問題でした。私はすべてのスペースを削除し、 'E'を' e'に変更しました。ドキュメントから、 'E'と' e'の両方がOKであることが分かります。修正をありがとう。 – ankit7540

関連する問題