CSV для разреженной матрицы в Python - PullRequest
9 голосов
/ 21 декабря 2009

У меня есть большой CSV-файл, в котором перечислены соединения между узлами в графе. Пример:

0001,95784
0001,98743
0002,00082
0002 00091

Таким образом, это означает, что идентификатор узла 0001 связан с узлами 95784 и 98743 и так далее. Мне нужно прочитать это в разреженной матрице в NumPy. Как я могу это сделать? Я новичок в Python, так что учебники по этому также помогут.

Ответы [ 3 ]

11 голосов
/ 21 декабря 2009

Пример использования lil_matrix (список матрицы списка) scipy.

Матрица связанных списков на основе строк.

Содержит список (self.rows) строк, каждая из которых представляет собой отсортированный список индексов столбцов ненулевых элементов. Он также содержит список (self.data) списков этих элементов.

$ cat 1938894-simplified.csv
0,32
1,21
1,23
1,32
2,23
2,53
2,82
3,82
4,46
5,75
7,86
8,28

Код:

#!/usr/bin/env python

import csv
from scipy import sparse

rows, columns = 10, 100
matrix = sparse.lil_matrix( (rows, columns) )

csvreader = csv.reader(open('1938894-simplified.csv'))
for line in csvreader:
    row, column = map(int, line)
    matrix.data[row].append(column)

print matrix.data

Выход:

[[32] [21, 23, 32] [23, 53, 82] [82] [46] [75] [] [86] [28] []]
2 голосов
/ 21 декабря 2009

Если вы хотите матрицу смежности, вы можете сделать что-то вроде:

from scipy.sparse import *
from scipy import *
from numpy import *
import csv
S = dok_matrix((10000,10000), dtype=bool)
f = open("your_file_name")
reader = csv.reader(f)
for line in reader:
    S[int(line[0]),int(line[1])] = True
1 голос
/ 21 декабря 2009

Вас также может заинтересовать Networkx , чистый пакет Python для работы с сетью / графикой.

с сайта:

NetworkX - это пакет Python для создания, управления и изучения структуры, динамики и функций сложных сетей.

>>> import networkx as nx
>>> G=nx.Graph()
>>> G.add_edge(1,2)
>>> G.add_node("spam")
>>> print G.nodes()
[1, 2, 'spam']
>>> print G.edges()
[(1, 2)]
...