如何选择一定数量的数据作为numpy数组?

时间:2012-09-13 04:51:41

标签: python numpy

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

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

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

需要帮助。

3 个答案:

答案 0 :(得分:1)

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

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

然后您可以使用以下内容获取每个第五个文件:every_fifth_file = datasets[::5]。另见:Explain Python's slice notation

答案 1 :(得分: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]])

答案 2 :(得分: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。您只需使用data[::5]访问其他每个第5个条目,这将为您提供一个形状(N/5, m, d)的数组,其第一个元素将是您的第5个数组...

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