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
...

这里最后三列分别代表轴 x、y、z 的值。现在我想要做的是,取第一行的 x、y、z 的值,并以迭代的方式减去第二、第三、第四行并打印每个轴的值。我正在使用:

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

用于分离值,但如何以迭代方式进行。我应该使用Counter.
预期输出:
对于 line1 vs line2:5.1 1.59 -7.89
对于 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 回答