1

我总共有 1000 个充满数据的 txt 文件。我已将它们全部复制到一个 txt 文件中,并将其加载到我的 python 代码中:

data = numpy.loadtxt('C:\data.txt')

到目前为止,这很好。现在,我需要从这 1000 个 txt 文件(即 200 个文件)中选择每 5 个文件,并将它们的组合内容加载到单个变量中。我对如何做到这一点感到困惑。

需要帮忙。

4

3 回答 3

1

了解文件是否具有相同的行数对我们来说至关重要。如果他们这样做了,您可以照原样继续并使用切片技巧。如果他们不这样做,那么您将需要单独加载文件以实现您想要的 - 文件分隔的位置已经在合并中丢失。

就个人而言,我认为大卫的建议在任何一种情况下都更好。但是,如果您想继续对大数据数组进行切片,请继续阅读...

>>> import numpy as np
>>> n = 2  # number of lines in each file
>>> N = 5  # number of files
>>> x = np.eye(n*N, dtype=int)  # fake example data
>>> x
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
>>> np.vstack(x[n*i:n*(i+1)] for i in range(N)[::2])  # every second file
array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
>>> np.vstack(x[n*i:n*(i+1)] for i in range(N)[1::3])  # every third file, skipping the first
array([[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])
于 2012-09-13T05:37:32.920 回答
1

为什么不一次加载一个文件(假设文件是data-0000​​ through data-0999):

datasets = []
for file_number in range(1000):
    datasets.append(numpy.loadtxt("c:\\data-%04d" %(file_number, ))

然后你可以得到每五个文件:every_fifth_file = datasets[::5]. 另请参阅:解释 Python 的切片表示法

于 2012-09-13T05:07:15.810 回答
0

通过将所有 1000 个文件放在一个文件中,您简化了在 Numpy 中加载数据的操作(好点),但您丢失了每个初始文件中有多少行的信息(坏点)。

如果您知道所有文件的行数相同,那就太好了!使用N文件,m每个文件中都有行,您的数组的长度应为N*m. 所以,data[:m]有你的第一个文件的行,data[m:2*m]你的第二个文件的行,等等。所以,你的第五个文件是data[4*m:5*m],你的第十个data[9*m:10*m]. 当然,你可以做一些简单的递归来找到你想要的行。但是我们可以利用数组具有相同行数的事实:让我们重塑数组!

如果data形状为(N*m,d)d则每个文件的列数在哪里,您可以使用以下命令进行整形:

data_reshaped = data.reshape(N,m,d)

甚至更简单:

data.shape = (N, m, d)

现在,data是3D。您只需使用 访问每隔 5 个条目data[::5],这将为您提供一个 shape 数组(N/5, m, d),其第一个元素将是您最初的第 5 个数组...

请注意,此技巧仅在文件具有相同行数时才有效。如果他们不这样做,那么您将无法从每个文件中的行数列表中找到您想要的行。

于 2012-09-13T08:17:32.333 回答