我有几十个文件(a,b,c,...),每个文件具有以下格式:
文件a ------文件b ------文件c -------等
x1a y1a | x1b y1b | x1c y1c | ...
x2a y2a | x2b y2b | x2c y2c | ...
x3a y3a | x3b y3b | x3c y3c | ...
。
。
。
请记住,每个文件中有数百行,其中两列。 我只想逐行汇总每个文件的第二列,即
Y1 = y1a + y1b + y1c + ...
Y2 = y2a + y2b + y2c + ...
Y3 = y3a + y3b + y3c + ...
。
。
。
然后,创建一个新的两列文件,其内容为:
x1a Y1
x2a Y2
x3a Y3
。
。
。
有人可以帮忙吗?
谢谢!
答案 0 :(得分:1)
使用loadtxt
和一些巧妙的切片非常有可能。
在您的示例中,您似乎希望file_a
中的第一列,而第二列是所有y
行的总和。这是我使用的示例文件:
file_a.txt file_b.txt file_c.txt
1 2 4 3 1 2
3 4 2 1 6 7
5 6 6 7 9 1
7 8 5 2 2 3
首先,让我们通过水平堆叠然后将文件读取到数组中:
filenames = [f'file_{i}.txt' for i in ('a', 'b', 'c')]
arr = np.column_stack([np.loadtxt(f) for f in filenames])
[[1. 2. 4. 3. 1. 2.]
[3. 4. 2. 1. 6. 7.]
[5. 6. 6. 7. 9. 1.]
[7. 8. 5. 2. 2. 3.]]
现在我们的索引。我们可以通过从索引y
开始获取其他所有列来访问所有1
列:
arr[:, 1::2]
array([[2., 3., 2.],
[4., 1., 7.],
[6., 7., 1.],
[8., 2., 3.]])
所以现在我们可以沿第一个轴求和该数组,并再次使用column_stack
将其与第一列x
合并,最后写入文件:
out = np.column_stack([arr[:, 0], arr[:, 1::2].sum(1)])
np.savetxt('out.txt', out, fmt='%d')
这是out.txt
:
1 7
3 12
5 14
7 13