2016-11-21 14 views
0

Iは次のように繰り返され、約3000ブロックを有するファイル(二つの第一図示)を有する:ファイルを複数の座標で読み込み、別々の配列に格納する方法は?

座標の各セットは、(この場合は21)の原子の数で区切られ
21 
Profile. 1 HEAT OF FORMATION = -79.392 KCAL = -332.175 KJ 
    H  -2.22728  -1.35263  1.32579 
    H  1.21425  -1.35263  1.32579 
    C  1.43878  0.44129  1.32579 
    O  2.25748  -0.52202  1.23773 
    C  0.12570  -0.10907  1.38542 
    H  -0.47394  0.10034  2.26424 
    C  -2.02530  -1.28825  -2.05204 
    C  -0.80697  -0.63466  -2.22403 
    H  -0.41632  -0.42983  -3.21532 
    H  0.84731  0.28355  -1.21782 
    C  -0.09866  -0.24043  -1.09182 
    C  -1.83256  -1.15779  0.32994 
    C  -0.59706  -0.50055  0.19091 
    H  -3.51151  -2.06378  -0.69513 
    C  -2.55421  -1.55647  -0.78456 
    O  -2.78665  -1.71220  -3.09841 
    H  -2.37922  -1.48635  -3.96745 
    H  2.21062  3.22762  2.75985 
    C  1.91952  1.85374  1.37731 
    O  2.22890  2.54529  0.44919 
    O  1.92486  2.27899  2.65936 
    21 
Profile. 2 HEAT OF FORMATION = -79.390 KCAL = -332.168 KJ 
    H  -2.22728  -1.35263  1.32579 
    H  1.21674  -1.35282  1.32529 
    C  1.43862  0.44132  1.32582 
    O  2.25745  -0.52214  1.23772 
    C  0.12565  -0.10889  1.38540 
    H  -0.47402  0.10051  2.26417 
    C  -2.02530  -1.28825  -2.05204 
    C  -0.80697  -0.63465  -2.22403 
    H  -0.41632  -0.42983  -3.21531 
    H  0.84730  0.28355  -1.21782 
    C  -0.09865  -0.24043  -1.09182 
    C  -1.83256  -1.15780  0.32995 
    C  -0.59702  -0.50058  0.19094 
    H  -3.51151  -2.06378  -0.69513 
    C  -2.55421  -1.55647  -0.78456 
    O  -2.78666  -1.71220  -3.09841 
    H  -2.37922  -1.48635  -3.96745 
    H  2.21061  3.22763  2.75985 
    C  1.91953  1.85373  1.37732 
    O  2.22890  2.54528  0.44919 
    O  1.92486  2.27898  2.65936 

と生成熱。

私は、これらの配列の特定の要素を最終的に操作できるように、各座標セットを読み込んで別の配列に書き込む方法を知りたいと思います。私はコメントで示唆したように

+0

'np.genfromtxt'は、その行を供給するものからの入力を受け入れます。簡単な始まりは、すべての行をリストに読み込むことです( 'readlines')。リストをブロックに分割し、それらを個別に 'genfromtxt'に渡し、ブロックごとに別々の配列を取得します。 – hpaulj

答えて

1

は、すべての行を読む:

In [783]: with open('stack40730696.txt','rb') as f: 
    ...:  lines = f.readlines() 

は私が等を行単位で、ブロックごとに、読むことができました。しかし、それはリストで遊ぶのが最も簡単です。

ここで最初のブロックを読み取ります。 「21」のようになり、データ線の数である:

In [784]: i=0 
In [785]: n=int(lines[i]) 
In [786]: n 
Out[786]: 21 
In [787]: i+=1 
In [788]: block=lines[i:i+1+n] # grab the lines of a block, with header 
In [789]: block[0] 
Out[789]: b'Profile. 1 HEAT OF FORMATION = -79.392 KCAL = -332.175 KJ\n' 
In [790]: block[-1] 
Out[790]: b' O  1.92486  2.27899  2.65936\n' 

genfromtxtの配列に読み込みます。結果を確認してください。私はすべてを印刷しましたが、ここではいくつかの詳細を印刷します。

In [791]: data1=np.genfromtxt(block, skip_header=1,dtype=None) 
In [792]: data1.shape 
Out[792]: (21,) 
In [793]: data1.dtype 
Out[793]: dtype([('f0', 'S1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')]) 

次のブロックに進み、繰り返します。もちろん、ファイル全体に対して、これをループに入れて、data配列をリストに集めます。

In [794]: i=i+1+n 
In [795]: n=int(lines[i]) 
In [796]: i+=1 
In [797]: block=lines[i:i+1+n] 
In [798]: data2=np.genfromtxt(block, skip_header=1,dtype=None) 
In [799]: data2.shape 
Out[799]: (21,) 
In [800]: data2.dtype 
Out[800]: dtype([('f0', 'S1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')]) 

数を記録

In [802]: data2[:3] 
Out[802]: 
array([(b'H', -2.22728, -1.35263, 1.32579), 
     (b'H', 1.21674, -1.35282, 1.32529), 
     (b'C', 1.43862, 0.44132, 1.32582)], 
     dtype=[('f0', 'S1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')]) 

これは、構造化された1つの文字列フィールドを持つ配列、および3つのフロートのものです。これは、文字列配列と(21,3)浮動小数点配列に分割することができます。

In [803]: dataf=np.genfromtxt(block, skip_header=1,usecols=[1,2,3]) 
In [804]: dataf.shape 
Out[804]: (21, 3) 
In [805]: dataf.dtype 
Out[805]: dtype('float64') 
+0

私のコードをループとして書き直すことは、基本的なPythonプログラミングでなければなりません。私の最初の試行は、ラインを使い果たしたときに休憩をとった「while」ですが、「for」でもかまいません。 'for i in range(0、len(lines)、22):' – hpaulj

関連する問題