2

私はPythonに非常に慣れていないため、同様の質問を見つけるために多くのことを検索しました。この質問Computing averages of records from multiple files with python で説明されているのと同様のことをしたいと思い ます

ただし、各値の平均を取得する代わりに (この例ではすべての値が数値です)、1 つの列の平均を取得したいのですが、他の列の値はすべて同じにしておきます。"

例えば:

fileA.txt:  
0.003 0.0003 3 Active   
0.003 0.0004 1 Active  

fileB.txt:  
0.003 0.0003 1 Active   
0.003 0.0004 5 Active  

そして、次の出力ファイルを生成したいと思います

output.txt
0.003 0.0003 2 Active   
0.003 0.0004 3 Active

列 1 と 2 も数値ですが、100 個のファイル間で同じ位置の同じ値になります。したがって、列 3 の 100 ファイルにわたる各要素の平均値のみに関心があります。

また、 python を使用して複数のファイルからのレコードの平均を計算するという質問のコードは、私のファイルを読み取るために機能します。ファイルがたくさんある場合は役に立ちません。どうすればそれを最適化できますか?

次のコードを使用して、ファイルを読み取ることができます。

import numpy as np

result = []
for i in my_files:
    a = np.array(np.loadtxt(i, dtype = str, delimiter = '\t', skiprows = 1))
    result.append(a)
result = np.array(result)

この質問で提案されている同様のコードを使用しました numpy 配列を初期化します

私の各ファイルは、4 列あたり約 1500 行になります。np.meanを使用しようとしましたが、データの一部が文字列型であるため、おそらく機能しません。

よろしくお願いします。

4

2 に答える 2

1

で配列をロードするとnp.genfromtxt(..., dtype=None)genfromtxt各列の dtype が推測されます。たとえば、3 番目の列には整数の dtype が与えられます。これにより、配列が算術に適したものになります。結果を使用dtype='str'すると文字列の配列になるため、算術演算には適していません。


import csv
import numpy as np
import itertools as IT
my_files = ['fileA.txt', 'fileB.txt']

vals = None
for num, filename in enumerate(my_files, 1):
    arr = np.genfromtxt(filename, dtype=None, delimiter='\t', skiprows=1, usecols=(2,))
    print(arr)
    if vals is None:
        vals = arr
    else:
        vals += arr

meanvals = vals / num

with open(my_files[0], 'rb') as fin, open('/tmp/test.csv', 'wb') as fout:
    # skip first row
    next(fin)
    writer = csv.writer(fout, delimiter='\t', lineterminator='\n')
    for row, val in IT.izip(csv.reader(fin, delimiter='\t'), meanvals):
        row[2] = val
        writer.writerow(row)

結果は/tmp/test.csv次のようになります。

0.003   0.0003  2   Active
0.003   0.0004  3   Active
于 2013-07-19T18:17:27.073 に答える
0

np.loadtxt: には別のキーワード arg がありますusecols。それを使ってみてください、例えば

a = np.loadtxt(i, usecols = (0,1,2), delimiter = '\t', skiprows = 1)

np.importtxt は ndarray を返すため、np.array は必要ありません。デフォルトは dtype=float であるため、dtype=str を省略しました。平均を計算する場合は、これで問題ありません。

また、配列の配列を作成する代わりに、各ファイルの平均を計算するだけの場合は、for ループ内でそれを行い、その計算結果を保存することをお勧めします。

于 2013-07-19T18:49:55.763 に答える