如何从数字列表创建稀疏矩阵
我有三个列表,分别叫做 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 矩阵,是因为它在例子里。你可以选择其他类型的矩阵。你可能需要尝试一下,看看哪种最适合你的情况。它们在数据压缩的方式上有所不同,这会影响某些操作的性能。