2014-04-02 28 views
2

我试图将所有使用MATLAB编写的代码转换为python。我有一个问题,我找不到解决问题的方法。也许有人有一个想法。如何读取文件,基于指定的列进行排序

我有一个文件,它有m行和两列。我想读取文件,然后根据第二列对文件进行排序。之后,我必须使用排序后的第一列(从第一行到第1000行)并查找大于阈值的值(此处为例如0.2)并将它们相加。

希望有人有一个想法。 由于

+0

你必须读取文件,并从文件数据创建'list'。在列表中,您可以执行像“排序”等操作。如果要写回排序数据,可以写入相同的文件。 – Nilesh

+0

你能告诉我们你到目前为止所尝试过的吗? – michaeltang

+0

如果你是从matlab到python世界,那么我建议你使用SciPy。 –

回答

3

如果该文件是例如用通过突出部和按列分离的问题的行分隔的字段非常简单:

f = open("filename.csv") 
data = [map(float, x.split("\t")) for x in f.readlines()] 
data.sort(key = lambda x:x[1]) 
result = sum(x[0] for x in data[:1000] if x[0] > 0.2) 
+0

谢谢。除了一个问题的总结,它的作品。我从我的MATLAB代码中知道,大于阈值的值的总和例如是56.但是在遵循这个代码之后,值是59!我检查了其他文件,我发现结果之间的差异在2到4之间变化!你有什么想法,可能是什么原因?再次感谢。 – Sam

+0

@Samira:其中一种可能性是第二列有多个具有相同值的行,因此哪些行结束于前1000位对于Python和Matlab可能不同(Python排序是稳定的,我不知道Matlab排序算法)。 – 6502

0

考虑使用numpy的阵列和它的伴随功能。它们(通常)与MATLAB中的那些非常相似,这可能会使后者更容易转换。

import numpy as np 

data = np.genfromtext("filename.csv", delimiter="\t", dtype=np.float) 
idx = np.argsort(data[:, 1]) 
data1000 = data[idx[:1000]] # First 1000 of sorted data 
result = np.sum(data1000[data1000[:, 0] > 0.2, 0]) 
相关问题