csv для разреженной матрицы в python

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

0001,95784
0001,98743
0002,00082
0002,00091

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


person Ankur Chauhan    schedule 21.12.2009    source источник
comment
Что вы подразумеваете под «0001 подключен к 95784» с точки зрения матрицы, которую вы хотите иметь?   -  person kender    schedule 21.12.2009
comment
Под этим я подразумеваю, что узел (id: 0001) имеет прямую ссылку на узел (id: 95784)   -  person Ankur Chauhan    schedule 21.12.2009


Ответы (3)


Пример использования 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] []]
person miku    schedule 21.12.2009
comment
Именно то, что мне было нужно. Любые хорошие ресурсы для scipy, которые вы можете порекомендовать? - person Ankur Chauhan; 21.12.2009
comment
Один маленький вопрос. Числа в csv не являются индексами. they are Ids ie the file starts with 0001001,9304045 0001001,9308122 0001001,9309097 0001001,9311042 0001001,9401139 0001001,9404151 0001001,9407087 0001001,9408099 0001001,9501030 0001001,9503124 So how do i convert these IDs to numerical indices, the Сервер ID предназначен только для идентификации узлов, они могут быть заменены эквивалентными индексами, если они уникальны. Как мне это сделать. Я знаю, что могу просто сделать строки и столбцы такими же большими, как самый большой идентификатор, но это кажется расточительным, поскольку узлы, такие как индексы 0–1001, тратятся впустую. - person Ankur Chauhan; 21.12.2009
comment
Я понимаю вашу озабоченность и предполагаю, что нет лучшего способа «сжать» ваши данные до соответствующих элементов. это во многом зависит от вашей цели, что вы хотите делать с данными позже. например вы можете использовать «словарь сопоставления», который сопоставляет фактические идентификаторы с некоторыми меньшими числовыми значениями... - person miku; 21.12.2009
comment
Если вы хотите «сжать» свои индексы так, чтобы они начинались с 0 и возрастали с шагом 1 до некоторого максимума, почему бы (1) не отсортировать их, создав sorted_ixs (sorted_ixs = ixs; sorted_ixs.sort()), (2) zip(sorted_ixs, range(len(sorted_ixs)), создав список совпадающих пар индекс со «сжатым индексом», (3) использовать список как «таблицу перевода» из старых индексов в новые. - person Michał Marczyk; 22.12.2009
comment
На самом деле, я думаю, это также отсортирует ixs; используйте sorted_ixs = ixs[:], если хотите сохранить несортированный ixs. - person Michał Marczyk; 22.12.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
person tkerwin    schedule 21.12.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)]
person mavnn    schedule 21.12.2009