使用Python中的三元组表示添加矩阵

时间:2013-06-27 16:39:31

标签: python python-2.7 matrix pandas adjacency-matrix

我想知道如何在Python中添加矩阵,并且我遇到了很多障碍,试图找出最好的方法。

这是问题,写得最好,我现在可以制定它。

我有一个数据集,它是有向图的邻接矩阵,其中生物病毒的分离物通过有向边缘连接到另一种流感病毒,从Isolate 1Isolate 2 。该邻接矩阵的当前表示如下:

Adjacency Matrix for Part 1
===========================
Isolate 1    Isolate 2    Connected?
---------    ---------    ---------    
ID1          ID2          1
ID1          ID3          1
ID2          ID4          1

如上所示,对于给定的部分,并非每个分离物都连接到另一个分离物。我有另一个稀疏矩阵,说明了相同类型的连接但是对于不同的部分。这就是它的样子:

Adjacency Matrix for Part 2
===========================
Isolate 1    Isolate 2    Connected?
---------    ---------    ----------
ID1          ID2          1
ID1          ID3          1
ID1          ID4          1

这里的区别在于ID1连接到ID4,而不是ID2连接到ID4。

所以我想做的是添加这两个邻接矩阵。我期望的是以下内容:

Summed Adjacency Matrix
=======================
Isolate 1    Isolate 2    Connected?
---------    ---------    ---------    
ID1          ID2          2
ID1          ID3          2
ID1          ID4          1
ID2          ID4          1

有人知道如何使用Python包有效地做到这一点吗?我的大部分工作都是在iPython的HTML笔记本中完成的,而且我一直非常依赖Pandas 0.11进行此分析。如果有一个答案,我可以避免将数据转换为一个巨大的矩阵(500x500),这将是最好的!

谢谢大家!

3 个答案:

答案 0 :(得分:1)

这是一种简单的方法(如果你愿意的话,最后可以reset_index()

使用id1和id2上的多索引创建

In [24]: df1 = DataFrame([['ID1','ID2',1],['ID1','ID3',1],['ID2','ID4',1]],columns=['id1','id2','value']).set_index(['id1','id2'])

In [25]: df2 = DataFrame([['ID1','ID2',1],['ID1','ID3',1],['ID1','ID4',1]],columns=['id1','id2','value']).set_index(['id1','id2'])

In [26]: df1
Out[26]: 
         value
id1 id2       
ID1 ID2      1
    ID3      1
ID2 ID4      1

In [27]: df2
Out[27]: 
         value
id1 id2       
ID1 ID2      1
    ID3      1
    ID4      1

加入索引

In [35]: joined_index = df1.index+df2.index

通过联合索引重新索引,填充0并添加

In [36]: df1.reindex(joined_index,fill_value=0) + df2.reindex(joined_index,fill_value=0)
Out[36]: 
         value
id1 id2       
ID1 ID2      2
    ID3      2
    ID4      1
ID2 ID4      1

这是另一种方式(并且如果指定join kw,则允许各种加入方式)

In [41]: a1, a2 = df1.align(df2, fill_value=0)

In [42]: a1 + a2
Out[42]: 
         value
id1 id2       
ID1 ID2      2
    ID3      2
    ID4      1
ID2 ID4      1

答案 1 :(得分:0)

假设您将邻接数据作为连接列表:

import itertools
from collections import defaultdict

adj1 = [
    ('A', 'B'),
    ('A', 'C'),
    ('B', 'D')
]

adj2 = [
    ('A', 'B'),
    ('A', 'C'),
    ('A', 'D')
]

result = defaultdict(int)
for adjacency in itertools.chain(adj1, adj2):
    result[adjacency] +=1

允许相同隔离物之间的任意数量的连接(例如0,2,10):

import itertools
from collections import defaultdict

adj1 = [
    ('A', 'B', 0),
    ('A', 'C', 10),
    ('B', 'D', 1)
]

adj2 = [
    ('A', 'B', 3),
    ('A', 'C', 1),
    ('A', 'D', 1)
]
result = defaultdict(int)
for isolate1, isolate2, connections in itertools.chain(adj1, adj2):
    result[(isolate1, isolate2)] += connections

在这两种情况下,result都是表单(isolate1, isolate2) -> sum of adjacencies

的字典

答案 2 :(得分:0)

scipy.sparse.coo_matrix()从三元组构造一个稀疏矩阵。只需为每个邻接图构建一个coo_matrix并添加它们:A+B。就这么简单。