加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读