如何从数字列表创建稀疏矩阵

4 投票
4 回答
18153 浏览
提问于 2025-04-16 20:04

我有三个列表,分别叫做 A、B 和 C。所有这些列表里都有 97510 个项目。我需要创建一个稀疏矩阵,像这样:

matrix[A[0]][B[0]] = C[0]

举个例子,

A=[1,2,3,4,5] 
B=[7,8,9,10,11] 
C=[14,15,16,17,18]

我需要用这些数据来创建一个稀疏矩阵,

matrix[1][7] = 14 # (which is C[0])
matrix[2][8] = 15 # and so on ..... 

我试过了,但是 Python 给我报错,说“索引值必须是连续的”。

我该怎么做呢?

4 个回答

3

使用字典(dict)非常简单,特别是如果你愿意稍微改变一下写索引的方式。

>>> A=[1,2,3,4,5] 
>>> B=[7,8,9,10,11] 
>>> C=[14,15,16,17,18]
>>> matrix=dict(((a,b),c) for a,b,c in zip(A,B,C))
>>> matrix[1,7]
14
>>> matrix[2,8]
15
>>> 
4

如果你只是想知道怎么把矩阵中的某个位置,比如说matrix[A[0]][B[0]],赋值为C[0],你可以使用下面的代码:

A=[1,2,3,4,5]
B=[7,8,9,10,11]
C=[14,15,16,17,18]

matrix = dict((v,{B[i]:C[i]}) for i, v in enumerate(A))

编辑过了(感谢gnibbler):

A = [1,2,3,4,5]
B = [7,8,9,10,11]
C = [14,15,16,17,18]

matrix = dict(((v, B[i]), C[i]) for i, v in enumerate(A))
8

我建议你看看 SciPy 的稀疏矩阵。比如说,COO 稀疏矩阵:

matrix = sparse.coo_matrix((C,(A,B)),shape=(5,5))

注意:我之所以选择 COO 矩阵,是因为它在例子里。你可以选择其他类型的矩阵。你可能需要尝试一下,看看哪种最适合你的情况。它们在数据压缩的方式上有所不同,这会影响某些操作的性能。

撰写回答