0

私の仕事は、20x20x20の寸法のボックス内にランダムな座標(そのうち512個)を生成することでした。

この3D画像を表示するプログラムには、次の形式のXYZファイルが必要です。

1000.000000 #number of coordinates
comment goes here #coment line
H 0.000000 0.000000 0.000000 #1st colmun is arbitary - we'll leave it H, 2nd is x vavlue, 3rd value is y value and 4th column is z value.
H 0.000000 0.000000 1.000000
H 0.000000 0.000000 2.000000
H 0.000000 0.000000 3.000000

これまでのところ、

import random
numpoints=512
L=20
while len(points)<numpoints:
    p = (random.randint(0, L), random.randint(0, L), random.randint(0, L))
    if p not in points:
        points.add(p)

これにより、(x、y、z)座標が生成されますが、私が抱えている問題は、それをテキストファイルに入れることです。

私はこのようなものから始めましたが、いくつかの助けが必要です:

with open("question1.xyz","w") as file:
     file.write("\ncomment goes here\n") #this is for the 2nd line in my xyz file
     while len(points)<numpoints:
        p = (random.randint(0, L), random.randint(0, L), random.randint(0, L))
        if p not in points:
            points.add(p)
                    file.write('H %f %f %f\n' % (x, y, z))

これは私が出力を作成しなければならないものであり、行数は最初の行に配置されますが、何らかの理由でファイルがエミュレートされません

#this will put the number of particles as the first line and generate an output file
with open("question2.xyz") as infile:
    with open("q2Output.xyz","w") as outfile:
        for i,line in enumerate(infile):
            if i==0:
                outfile.write('%f\n'%counter)
            else:
                outfile.write(line)

カウンターが存在しないためにわかりましたが、もっと効率的な方法はありますか?

4

2 に答える 2

2

これはもう少しきれいにすることができますが、行われた基本的な変更は次のとおりです。

  1. pointsコンテナの追加
  2. fileに変更f(Python 組み込みと同じ名前の変数を定義することは避けたい)、
  3. タプルを受け入れるようにフォーマットパラメーターを変更しますp(自動的に解凍されます)
  4. 基本的な書式設定の変更を行います。

全体として、あなたは非常に近かった - 微調整が必​​要ないくつかの基本的なことだけ.

import random

numpoints = 512
L = 20
points = set()

# Open f and write
with open("question1.xyz","w") as f:
    f.write("\ncomment goes here\n") #this is for the 2nd line in my xyz f
    while len(points) < numpoints:
        p = (random.randint(0, L), random.randint(0, L), random.randint(0, L))
        if p not in points:
            points.add(p)
            f.write('H %f %f %f\n' % p)

以下は効率的ではありませんが、ランダムな点を生成するために再帰の概念を導入しています。以前のバージョンは問題なく動作します - これはもっと楽しいものです :)

import random

numpoints = 512
L = 20
points = set()

def RandomPoint(points):
    p = (random.randint(0, L), random.randint(0, L), random.randint(0, L))
    if p in points:
      p = RandomPoint(points)
    return p

# Open f and write
with open("question1.xyz","w") as f:
    f.write("\ncomment goes here\n") #this is for the 2nd line in my xyz f
    for point in xrange(0, numpoints):
        p = RandomPoint(points)
        points.add(p)
        f.write('H %f %f %f\n' % p)
于 2012-10-03T04:30:18.793 に答える
1

次のようなものを試してください。

fh = open('filename', 'w')
fh.write(str(len(points)) + '\n')
fh.write("comment goes here\n")
for point in points:
    fh.write("H %1.6f %1.6f %1.6f\n" % (point[0],point[1],point[2]))
fh.flush()
fh.close()
于 2012-10-03T04:22:04.923 に答える