我总共有 1000 个充满数据的 txt 文件。我已将它们全部复制到一个 txt 文件中,并将其加载到我的 python 代码中:
data = numpy.loadtxt('C:\data.txt')
到目前为止,这很好。现在,我需要从这 1000 个 txt 文件(即 200 个文件)中选择每 5 个文件,并将它们的组合内容加载到单个变量中。我对如何做到这一点感到困惑。
需要帮忙。
了解文件是否具有相同的行数对我们来说至关重要。如果他们这样做了,您可以照原样继续并使用切片技巧。如果他们不这样做,那么您将需要单独加载文件以实现您想要的 - 文件分隔的位置已经在合并中丢失。
就个人而言,我认为大卫的建议在任何一种情况下都更好。但是,如果您想继续对大数据数组进行切片,请继续阅读...
>>> 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]])
为什么不一次加载一个文件(假设文件是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 的切片表示法
通过将所有 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 个数组...
请注意,此技巧仅在文件具有相同行数时才有效。如果他们不这样做,那么您将无法从每个文件中的行数列表中找到您想要的行。