python-2.7 – 读取矩阵并在python中获取行名和列名
发布时间:2020-12-20 12:09:30 所属栏目:Python 来源:网络整理
导读:我想读一个矩阵文件,看起来像: sample sample1 sample2 sample3sample1 1 0.7 0.8sample2 0.7 1 0.8sample3 0.8 0.8 1 我想获取所有值为的对0.8.例如:sample1,sample3 0.8 sample2,sample3 0.8等在一个大文件中. 当我使用csv.reader时,每一行都会转入一个
我想读一个矩阵文件,看起来像:
sample sample1 sample2 sample3 sample1 1 0.7 0.8 sample2 0.7 1 0.8 sample3 0.8 0.8 1 我想获取所有值为>的对0.8.例如:sample1,sample3 0.8 sample2,sample3 0.8等在一个大文件中. 当我使用csv.reader时,每一行都会转入一个列表并跟踪行名和列名会使程序变得狡猾.我想知道一种优雅的方式,比如使用numpy或pandas. 期望的输出: sample1,sample3 0.8 sample2,sample3 0.8 1可以忽略,因为在相同的样本之间,它总是1. 解决方法
您可以使用
np.triu 屏蔽掉上三角形值:
In [11]: df Out[11]: sample1 sample2 sample3 sample sample1 1.0 0.7 0.8 sample2 0.7 1.0 0.8 sample3 0.8 0.8 1.0 In [12]: np.triu(df,1) Out[12]: array([[ 0.,0.7,0.8],[ 0.,0.,0. ]]) In [13]: np.triu(df,1) >= 0.8 Out[13]: array([[False,False,True],[False,False]],dtype=bool) 然后提取它是真的索引/列我认为你必须使用np.where *: In [14]: np.where(np.triu(df,1) >= 0.8) Out[14]: (array([0,1]),array([2,2])) 这为您提供了第一个索引索引和列索引的数组(这是这个numpy版本中效率最低的部分): In [16]: index,cols = np.where(np.triu(df,1) >= 0.8) In [17]: [(df.index[i],df.columns[j],df.iloc[i,j]) for i,j in zip(index,cols)] Out[17]: [('sample1','sample3',0.80000000000000004),('sample2',0.80000000000000004)] 如预期的. *我可能忘记了获取最后一个块的更简单方法(编辑:下面的pandas代码可以做到,但我认为可能还有其他方法.) 您可以在pandas中使用相同的技巧,但使用stack来本机获取索引/列: In [21]: (np.triu(df,1) >= 0.8) * df Out[21]: sample1 sample2 sample3 sample sample1 0 0 0.8 sample2 0 0 0.8 sample3 0 0 0.0 In [22]: res = ((np.triu(df,1) >= 0.8) * df).stack() In [23]: res Out[23]: sample sample1 sample1 0.0 sample2 0.0 sample3 0.8 sample2 sample1 0.0 sample2 0.0 sample3 0.8 sample3 sample1 0.0 sample2 0.0 sample3 0.0 dtype: float64 In [24]: res[res!=0] Out[24]: sample sample1 sample3 0.8 sample2 sample3 0.8 dtype: float64 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |