как создать разреженную матрицу из списков чисел - PullRequest
4 голосов
/ 22 июня 2011

У меня есть три списка, а именно 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[1])
matrix[2][8] = 15 #and so on .. 

Я попытался, и python выдает ошибку, в которой говорится, что «значения индекса должны быть непрерывными»

Как мне это сделать?

Ответы [ 4 ]

8 голосов
/ 22 июня 2011

Предлагаю вам взглянуть на Разреженные матрицы SciPy .Например, разреженная матрица COO:

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

Примечание: я просто взял матрицу COO, потому что в примере вы можете взять любую другую .Вы, вероятно, должны попробовать, какой из них наиболее подходит для вашей ситуации.Все они различаются по способу сжатия данных, и это влияет на производительность определенных операций.

4 голосов
/ 22 июня 2011

Если вам просто нужен способ получить матрицу [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))

EDITED (спасибо за 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))
2 голосов
/ 22 июня 2011

Очень просто использовать диктовку, особенно если вы хотите немного изменить способ написания индексов

>>> 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
>>> 
0 голосов
/ 22 июня 2011

Посмотрите на numpy / scipy, в котором есть поддержка разреженных матриц.См. Например здесь

...