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

2024-05-11 02:45:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何在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),那将是最好的!你知道吗

谢谢大家!你知道吗


Tags: 数据方法for生物矩阵matrix障碍id3
3条回答

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

{end}如果你想的话,这里的方法是直接的

使用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

这里是另一种方式(如果您指定joinkw,则允许各种连接方式)

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

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

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的字典

相关问题 更多 >