我试图逐步减去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值取下,然后以迭代的方式减去第2,3,4行,并打印每个轴的值。 我正在使用:
for line in map(str.split,inp):
x = line[-3]
y = line[-2]
z = line[-1]
用于分隔值,但如何以迭代方式进行。我应该使用Counter
来做到这一点
预期产量:
for line1 vs line2:5.1 1.59 -7.89
for line1 vs line3:5.78 -10.88 -9.21
......等等。
答案 0 :(得分: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)]
答案 1 :(得分: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)]