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

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

ただいまの
回答率

91.03%

  • Python

    5523questions

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

  • Python 3.x

    4080questions

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

Pythonによる座標の解析

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 173

crmy

score 7

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] ))
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

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

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

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

import sys

input_file_name = sys.argv[1]
input_file = open(input_file_name , "r")

range_max =  250.
range_min = -250.
range_num = 5000
range_step = (range_max-range_min)/range_num
result = [0.0]*range_num

loop = 100
for l in range(loop):
    natoms = int(input_file.readline())
    dummy  = input_file.readline()

    atom_name = [""]*natoms
    zzz_coord = [0.0]*natoms

    for iatom in range(natoms):
        line = input_file.readline()
        items = line.split()
        atom_name[iatom] = items[0]
        zzz_coord[iatom] = float(items[3])

    for i in range(natoms):
        for j in range(range_num):
            rstart = range_min+range_step*j
            if atom_name[i] == "A" and rstart <= zzz_coord[i] < rstart+range_step:
                result[j] += 1
            else: 
                continue
for i in range(range_num):
   rstart = range_min+range_step*i
   print("{0} {1} {2}".format(rstart,rstart+range_step,result[i]))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/08 16:04

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

    キャンセル

  • 2017/11/08 16:09

    およそ正しいのですが、厳密には0.1刻みになるようにするためです。
    例えば、500にすると1刻みに、50000にすると0.01刻みに、1000にすると0.5刻みになります。

    範囲自体はrange_minからrange_maxになるようにしています。

    キャンセル

  • 2017/11/08 18:17

    ありがとうございます。

    キャンセル

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 受付中

    プログラムソースを教えて欲しいです

    前提・実現したいこと しりとりプログラムを作ろうとしています。 CSVデータ中の情報を読み込みデータ内の単語のみでしりとりを行います。 ルールとして ・CPUとの対戦型

  • 解決済

    [Python3]標準入力での一行ずつでの読み込みについて

    例えば標準入力で 68455648 ←ここで改行されている 46564645 ←ここで改行されている 78931646 ←ここで改行されている のような値が入力さ

  • 解決済

    【Python】数値のみ入力を受け付ける

    こんにちは。プログラム初心者です。。。 Python 3系にて、入力を受け付けて、数値に合わせて曜日を出力するプログラムを作っております。 0で終了。1~7で月曜日から日曜

  • 解決済

    【Python】標準入出力におけるリスト格納について

    前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが

  • 解決済

    Debian8にてheartbeatがインストールできない

    現在、Debian8(8.71 64bit GUI)が稼働しているPCに、apt-getコマンドで「heartbeat」をインストトールしようと しています。 apt-ge

  • 解決済

    python for構文に関して

    for構文で繰り返し表示される値を一列に並べたい 発生している問題・エラーメッセージ 3から始まる等差4の数列(10番目まで)を求める際 n=3 m=4 for i in rang

  • 解決済

    tensorflowでのalexnetの実装で精度が変化しない

    前提・実現したいこと こんにちは。 趣味で画像認識を勉強しているものです。 「tensorflowでゆるゆりの製作会社を判定してみた」(http://mobiles-han.blo

同じタグがついた質問を見る

  • Python

    5523questions

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

  • Python 3.x

    4080questions

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