【发布时间】:2013-07-19 03:05:37
【问题描述】:
我对 Python 很陌生,我也搜索了很多东西以找到与我类似的问题。我想做类似这个问题中解释的事情 Computing averages of records from multiple files with 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 个文件中每个元素的平均值感兴趣。
此外,尽管问题Computing averages of records from multiple files with 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)
我使用了这个问题initialize a numpy array中建议的类似代码
我的每个文件每 4 列大约有 1500 行。我尝试使用 np.mean 但它不起作用可能是因为我的某些数据是字符串类型。
提前感谢您的帮助!
【问题讨论】:
-
要确保所有元素都是数字,请尝试使用地图,例如allDouble = map( lambda el : float(el), mixedTypeArray )。另外,如果您希望它们是数字,请不要将 dtype 设置为 str。
-
谢谢!如果我没有将 dtype 设置为 str,我会收到以下错误消息:ValueError: could not convert string to float: Transposon Inactive。我如何使用这个地图功能...我不明白你的意思(对不起)。
-
你需要第四列吗?如果没有在下面看到我的答案。 map 是一个有用的函数,它允许您将函数应用于数组的每个成员。
lambda在 map 函数中定义了一个函数。相当于def toFloat(num): float(num); map( toFloat, arrayToBeConverted)。这需要一些时间来适应,但一旦你习惯了就会非常有用。 -
是的,我确实需要第四列。最后我会画一个图表。不过谢谢你的回答。
-
当然。您可以单独为该列调用 np.loadtxt,即
activeCol = np.loadtxt(i, dtype=str, usecols = (4), ... )