4

我有几个表文件,我加载它们:

x, y, rho, phi = np.loadtxt(myfile, unpack=True)

现在,考虑一下我有myfile1并且myfile2格式相同的情况。如何将它们加载到相同的数组中(好像只有一个文件)?

4

2 回答 2

4

有多种方法可以做到这一点(例如,您可以加载两个数组,然后通过x = numpy.concatenate((x1, x2))等连接它们),但我要做的是即时连接文件,并将结果传递给loadtxt.

正如文档所说,fname可以是:

要读取的文件、文件名或生成器。如果文件扩展名为 .gz 或 .bz2,则首先解压缩文件。请注意,生成器应该返回 Python 3k 的字节字符串。

因此,您只需要一个生成器来生成 myfile1,然后生成 myfile2。

显而易见的方法是itertools

with open(myfile1, 'rb') as f1, open(myfile2, 'rb') as f2:
  x, y, rho, phi = numpy.loadtxt(itertools.chain(f1, f2))

你可能会注意到我离开了unpack=True. 那是因为unpack只有在传递文件名而不是文件对象或生成器时才有效。(它查看扩展名,而不是文件魔术或任何花哨的东西。)

如果您知道这些文件将始终是 gzip 或 bzip2 文件,则可以替换gzip.GzipFilebz2.BZ2File替换open上述文件。

但是,如果您需要处理可能压缩的文件,则必须进行相同的扩展检查numpy,然后创建适当的对象(编写一个open_compressed将其包装起来的函数),此时这将变得顽固地坚持错误的解决方案。所以,如果这是一个问题,我可能会单独加载它们,然后再做numpy.concatenate.

于 2012-11-09T04:19:25.827 回答
4

您可以使用标准文件输入模块:

import fileinput
import glob
import numpy as np
data = np.loadtxt(fileinput.input(glob.glob("*.dat")))
于 2012-11-09T07:31:51.723 回答