0

我想知道如何在 中进行矩阵加法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's HTML notebook 中完成的,我一直非常依赖于Pandas 0.11做这个分析。如果有一个答案可以避免将数据转换为一个巨大的矩阵(500x500),那将是最好的!

谢谢大家!

4

3 回答 3

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
于 2013-06-27T16:57:43.567 回答
0

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

于 2013-06-27T17:54:23.073 回答
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

于 2013-06-27T16:54:15.117 回答