Создание разреженной матрицы из кадра данных с ребрами - PullRequest
0 голосов
/ 05 мая 2018

Предположим, у меня есть CSV-файл, содержащий данные в следующем формате:

A B

C D

A C

D F

G H

К М

M A

, где каждая строка дает ненаправленное ребро между узлом 1 и узлом 2. В настоящее время я читаю это как dataframe, но хотел бы преобразовать его в разреженную матрицу. Есть ли быстрый и простой способ сделать это без зацикливания?

1 Ответ

0 голосов
/ 06 мая 2018

Для непосредственного построения скудной разреженной матрицы необходимо сопоставить буквы по уникальным индексам, например, A == 1, B == 2 и т. Д.

In [202]: txt='''A B
     ...: 
     ...: C D
     ...: 
     ...: A C
     ...: 
     ...: D F
     ...: 
     ...: G H
     ...: 
     ...: K M
     ...: 
     ...: M A'''.splitlines()
In [203]: values = 'ABCDEFGHIJKLM'
In [204]: data = [x.split() for x in txt if x]
In [205]: data = [[values.index(x) for x in row] for row in data]
In [206]: data
Out[206]: [[0, 1], [2, 3], [0, 2], [3, 5], [6, 7], [10, 12], [12, 0]]

Так что теперь у нас есть пары координат. Существуют различные способы построения разреженной матрицы из них. Пожалуй, самое простое концептуально сделать это итеративно с матрицей формата lil (лучший формат для итеративного построения):

In [207]: from scipy import sparse
In [208]: M = sparse.lil_matrix((len(values),len(values)),dtype=int)
In [209]: for row in data:
     ...:     M[tuple(row)] = 1
     ...:     
In [210]: M
Out[210]: 
<13x13 sparse matrix of type '<class 'numpy.int64'>'
    with 7 stored elements in LInked List format>
In [211]: M.A
Out[211]: 
array([[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...