簡體   English   中英

計算多個文件的平均值

[英]Calculating the mean across multiple files

我是Python的新手,我也進行了大量搜索以查找與我的問題類似的問題。 我想做類似這個問題的解釋, 用python計算多個文件的記錄平均值

但是,我不想取每個值的平均值(在此示例中,所有值都是數字),我想取一列的平均值,而對其他列取所有相同的值”

例如:

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,但它可能無法正常工作,因為某些數據是字符串類型的。

在此先感謝您的幫助!

如果使用np.genfromtxt(..., dtype=None)加載數組,那么genfromtxt將猜測每列的genfromtxt 例如,第三列將被賦予整數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

np.loadtxt中還有另一個關鍵字arg: usecols 嘗試使用它,例如

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

您不需要np.array,因為np.importtxt返回ndarray。 我省略了dtype = str,因為默認值為dtype = float,如果您要計算平均值,它應該對您有用。

另外,如果您只想計算每個文件中的均值,而不是創建數組的數組,我建議您在for循環中執行此操作,並只保存該計算的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM