我想知道如何在Python
中添加矩阵,并且我遇到了很多障碍,试图找出最好的方法。
这是问题,写得最好,我现在可以制定它。
我有一个数据集,它是有向图的邻接矩阵,其中生物病毒的分离物通过有向边缘连接到另一种流感病毒,从Isolate 1
到Isolate 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),这将是最好的!
谢谢大家!
答案 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
。就这么简单。