1

データでいっぱいの合計1000個のtxtファイルがあります。それらすべてを単一のtxtファイルにコピーし、次のようにPythonコードにロードしました。

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

これは、この時点までは問題ありません。ここで必要なのは、それらの1000個のtxtファイル(つまり200個のファイル)から5番目ごとのファイルを選択し、それらを組み合わせたコンテンツを1つの変数にロードすることです。私はこれを行う方法について混乱しています。

助けが必要。

4

3 に答える 3

1

一度に1つずつファイルをロードしてみませんか(ファイルがdata-0000通過していると仮定してdata-0999):

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

次に、5つおきのファイルを次のように取得できますevery_fifth_file = datasets[::5]。参照:Pythonのスライス表記について説明する

于 2012-09-13T05:07:15.810 に答える
1

ファイルの行数が同じかどうかを知ることは非常に重要です。もしそうなら、あなたはすでにあなたがそうであるように進んで、スライストリックを使うことができます。そうでない場合は、目的を達成するためにファイルを個別にロードする必要があります。ファイルが区切られている位置は、マージですでに失われています。

個人的には、どちらの場合もDavidの提案の方が優れていると思います。しかし、ビッグデータ配列のスライスを進めたい場合は、読み進めてください...

>>> 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 に答える
0

1000個のファイルすべてを1つにまとめることで、Numpyにデータをロードする操作が簡素化されました(良い点)が、各初期ファイルの行数に関する情報は失われました(悪い点)。

すべてのファイルの行数が同じであることがわかっている場合は、すばらしいです。Nファイルを使用しm、各ファイルに行がある場合、配列の長さは。である必要がありますN*m。つまり、data[:m]最初のファイル、data[m:2*m]2番目のファイルなどの行があります。つまり、5番目のファイルはdata[4*m:5*m]、10番目のファイルですdata[9*m:10*m]。もちろん、必要な行を見つけるためにいくつかの単純な再帰を行うことができます。ただし、配列の行数が同じであるという事実を利用できます。配列の形状を変更しましょう。

dataの形状が(N*m,d)、各ファイルの列数である場合d、次のように再形成できます。

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

またはさらに簡単:

data.shape = (N, m, d)

さて、data3Dです。を使用して1つおきの5番目のエントリにアクセスするだけdata[::5]で、形状の配列が得られます(N/5, m, d)。その最初の要素は最初の5番目の配列になります。

このトリックは、ファイルの行数が同じ場合にのみ機能することに注意してください。そうでない場合は、各ファイルの行数のリストから必要な行を見つけるのに行き詰まります。

于 2012-09-13T08:17:32.333 に答える