Python中将csv转换为稀疏矩阵

9 投票
3 回答
11828 浏览
提问于 2025-04-15 17:14

我有一个很大的csv文件,里面列出了图中节点之间的连接关系。比如:

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

这意味着节点ID为0001的节点与节点95784和98743相连,依此类推。

我需要把这些数据读入numpy的稀疏矩阵中。我该怎么做呢?我对python还很陌生,所以相关的教程也会很有帮助。

3 个回答

2

你可能会对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)]
2

如果你想要一个邻接矩阵,可以这样做:

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
12

下面是一个使用 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] []]

撰写回答