0

3D マトリックスの値を徐々に減算しようとしていました。マトリックスは次のようになります。

ATOM 1223 ZX SOD A 11 2.11 -1.33 12.33
ATOM 1224 ZY SOD A 11 -2.99 -2.92 20.22
ATOM 1225 XH HEL A 12 -3.67 9.55 21.54
ATOM 1226 SS ARG A 13 -6.55 -3.09 42.11
...

ここで、最後の 3 つの列は、それぞれ軸 x、y、z の値を表しています。今私がやりたかったのは、1行目のx、y、zの値を取り、2行目、3行目、4行目で繰り返し減算し、各軸の値を出力することです。私が使用していた:

for line in map(str.split,inp):
    x = line[-3]
    y = line[-2]
    z = line[-1]

値を分離するためですが、反復的な方法で行う方法。を使ってやろうかなCounter
期待される出力:
for 5.1 1.59 -7.89
line1 vs line2: for line1 vs line3: 5.78 -10.88 -9.21
...など。

4

2 に答える 2

1

これにより、繰り返し/解凍できる[x、y、z]リストのリストが表示されます。

mylist = [map(float, line[-3:]) for line in map(str.split, inp)]

ただし、x、y、zから値の新しい行を減算した結果を繰り返し生成する場合は、次のようなジェネレーター関数を作成するのが最善の策です。

def matrix_gen(inp):
    """ iteratively subtracts values from first line of input 3D matrix """
    if len(inp) < 1: raise StopIteration
    first_line = inp[0].split()
    x,y,z = map(float, first_line[-3:])
    yield x,y,z
    for elem in inp[1:]:
        line = elem.split()
        new_x, new_y, new_z = map(float, line[-3:])
        yield x - new_x, y - new_y, z - new_z

ジェネレータは最初に最初のx、y、z値を生成し、その後、前の値から行列からx、y、zの次の値を減算した結果を生成します。次に、次の方法で(x、y、z)タプルを生成できます。

for x,y,z in matrix_gen(inp):
    # do something

最初の行を印刷したくない場合は、その最初のyieldステートメントを削除してください。

出力として文字列が必要なようです。次のようにして、このための文字列のリストを生成できます。

[' '.join(x) for x in matrix_gen(inp)]
于 2012-06-07T04:58:52.447 に答える
0

itertools優れている:

import itertools

ss = ['ATOM 1223 ZX SOD A 11 2.11 -1.33 12.33',
      'ATOM 1224 ZY SOD A 11 -2.99 -2.92 20.22',
      'ATOM 1225 XH HEL A 12 -3.67 9.55 21.54',
      'ATOM 1226 SS ARG A 13 -6.55 -3.09 42.11']

mylist = [map(float, i.split()[-3:]) for i in ss]
print [list(itertools.imap(lambda x,y: x - y, i[0], i[1])) for i in itertools.combinations(mylist, 2)]
于 2012-06-07T06:25:22.017 に答える