質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1747閲覧

Pythonによる座標の解析

crmy

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/11/07 05:56

Python初心者です。

上記のような原子の座標を示すファイルを解析するプログラムを作りたいと思っています。

2500
STEP: 1
A 10.0 -12.3 230.0
B 12.3 4.5 -45.0
C -10.2 8.4 -200.0



j 11.5 -5.6 -30.4
2500
STEP: 2
A 12.0 -17.3 250.0
B 12.3 -7.5 75.0
C -10.0 9.9 -210.0



j -14.5 20.3 -102.0

1STEPに10種類の原子があり、全部で100STEPあります。
1行目の2500は1STEPあたりの原子数で、2行目がSTEP数です。
Z軸の範囲は-250から250です。

Z軸を0.1ずつ変化させたときのある原子の個数を出すプログラムを書きたいと思い、
下記のプログラムを作成しました。

私が得たい結果は
-250 -249.9 0
-249.9 -249.8 1



249.9 250 2
のようにZ軸が0.1刻みで変化させたときの範囲のある原子数の個数を求め、
ヒストグラムを書きたいです。

下記のプログラムでは、Aという原子の個数を求めようとしています。
しかし、このプログラムでは

249.9 259.9の羅列が出力されるだけです。

どなたか、ご教授いただけますでしょうか。
よろしくお願いします。

import sys input_file_name = sys.argv[1] input_file = open( input_file_name , "r" ) loop = 100 for l in range(loop): natoms = int ( input_file.readline() ) title = input_file.readline() iatom = 0 atom_name = [""]*natoms zzz_coord = [0.0]*natoms result = [0.0]*natoms for iatoms in range(natoms): line = input_file.readline() items = line.split() atom_name[iatom] = items[0] zzz_coord[iatom] = float( items[3] ) iatom += 1 for i in range(natoms): for j in [0.1*x for x in range(-2500,2500)]: if atom_name[i] == "A" and j < zzz_coord[i] < j+0.1 : result[i] += 1 else: continue for i in range(natoms): print("{0:.1f} {1:.1f}".format(j,j+1,result[i] ))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

普通はnumpyのhistogramを使うかと思いますが、そんなに難しいコードではないのでできるだけ修正を加えないで変更します。

元のコードには問題が3つあって、
1.全ステップに渡ってヒストグラムを取りたいのに、ステップごとに集計を取っている点
2.ヒストグラムが範囲ではなく、原子番号をインデックスに持っている点
3.print文に引数が1つ足りていない点
となります。

また、ヒストグラムの範囲、細かさを変数にしました。

ちなみに、このコードはとても遅いです。
愚直な3重ループに加えて、pythonコードなので。
100ステップ、2500原子、解像度5000でも数秒から数分かかると予想されます。

速度改善には、
1.ファイルの読み込みを一度に済ます
2.z座標をリスト内包表記で取り出す
3.ヒストグラムの集計をnumpyなどのライブラリに任せる
ことを検討してみてください。

python

1import sys 2 3input_file_name = sys.argv[1] 4input_file = open(input_file_name , "r") 5 6range_max = 250. 7range_min = -250. 8range_num = 5000 9range_step = (range_max-range_min)/range_num 10result = [0.0]*range_num 11 12loop = 100 13for l in range(loop): 14 natoms = int(input_file.readline()) 15 dummy = input_file.readline() 16 17 atom_name = [""]*natoms 18 zzz_coord = [0.0]*natoms 19 20 for iatom in range(natoms): 21 line = input_file.readline() 22 items = line.split() 23 atom_name[iatom] = items[0] 24 zzz_coord[iatom] = float(items[3]) 25 26 for i in range(natoms): 27 for j in range(range_num): 28 rstart = range_min+range_step*j 29 if atom_name[i] == "A" and rstart <= zzz_coord[i] < rstart+range_step: 30 result[j] += 1 31 else: 32 continue 33for i in range(range_num): 34 rstart = range_min+range_step*i 35 print("{0} {1} {2}".format(rstart,rstart+range_step,result[i])) 36

投稿2017/11/08 01:47

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crmy

2017/11/08 07:04

回答ありがとうございます。 この言い方が適切かわかりませんが、range_num = 5000というのは、rstart等の計算が-250~250の範囲になるように5000に設定されたということでしょうか?
mkgrei

2017/11/08 07:09

およそ正しいのですが、厳密には0.1刻みになるようにするためです。 例えば、500にすると1刻みに、50000にすると0.01刻みに、1000にすると0.5刻みになります。 範囲自体はrange_minからrange_maxになるようにしています。
crmy

2017/11/08 09:17

ありがとうございます。
guest

0

pandasを使って、原子の種類とSTEPをindexにもつ

1 2 ... A 230.0 250.0 B -45.0 75.0 C -200.0 -210.0 : : : : j -30.4 -102.0

のようなデータフレームを作りましょう。
さすれば後は自明です。

投稿2017/11/07 06:05

WathMorks

総合スコア1582

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問