0

で行列の加算を行う方法を知りたいの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

ここでの違いは、ID2 が ID4 に接続されているのではなく、ID1 が ID4 に接続されていることです。

私がやりたいのは、これらの 2 つの隣接行列を追加することです。私が期待するのは次のとおりです。

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

Pythonパッケージを使用してこれを効率的に行う方法を知っている人はいますか? 私の作業のほとんどは の HTML ノートブックで行われており、この分析を行うために にiPython大きく依存してきました。Pandas 0.11データを巨大なマトリックス (500x500) に変換することを避けることができる答えがあれば、それが最善です!

みんなありがとう!

4

3 に答える 3

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 に答える
0

scipy.sparse.coo_matrix()はトリプレットからスパース行列を構築します。隣接グラフごとに coo_matrix を作成して追加するだけですA+B。それはとても簡単です。

于 2013-06-27T17:54:23.073 に答える