Как преобразовать разреженную матрицу в плотную форму, используя python

У меня есть следующая матрица, которую я считаю редкой. Я пытался преобразовать в плотный с использованием формата x.dense, но он никогда не работал. Любые предложения относительно того, как это сделать?, спасибо.

mx=[[(0, 2), (1, 1), (2, 1), (3, 1), (4, 1), (5, 3), (6, 4), (7, 2), (8, 5), (9, 1)], 
[(10, 1), (11, 5), (12, 2), (13, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 1), (26, 2)], 
[(27, 2), (28, 1), (29, 1), (30, 1), (31, 2), (32, 1), (33, 1), (34, 1), (35, 1), (36, 1)]]

кто-то выдвинул решение ниже, но есть ли лучший способ?

def assign_coo_to_dense(sparse, dense):
    dense[sparse.row, sparse.col] = sparse.data

mx.todense (). Предполагаемый результат должен выглядеть следующим образом:[[2,1,1,1,1,3,4], [1,5,2,1,1,1,1], [2,1,1,1,2,1,1,1]]

3 ответа

Решение

Понимание списка - самый простой способ:

new_list = [[b for _,b in sub] for sub in mx]

Результат:

>>> new_list
[[2, 1, 1, 1, 1, 3, 4, 2, 5, 1], [1, 5, 2, 1, 1, 1, 1, 1, 1, 2], [2, 1, 1, 1, 2, 1, 1, 1, 1, 1]]

Вот довольно хакерский способ сделать то, что вы просите:

dense = [[int(''.join(str(val) for _, val in doc))] for doc in mx]

По сути, он преобразует каждое значение из вложенных кортежей в строку и объединяет все эти строки вместе, а затем преобразует это обратно в целое число. Повторите для каждого элемента mx,

Ваши исходные данные в действительности не соответствуют ни одному из встроенных форматов, поддерживаемых разреженными матрицами в SciPy (см. http://docs.scipy.org/doc/scipy/reference/sparse.html и http://en.wikipedia.org/wiki/Sparse_matrix), поэтому с помощью .todense() не будет действительно продуктивным здесь. В частности, если у вас есть что-то вроде:

import numpy as np

my_sparseish_matrix = np.array([[(1, 2), (3, 4)]])

затем my_sparseish_matrix уже будет плотный массив NumPy! призвание .todense() на этом этапе это приведет к ошибке, и в любом случае не имеет смысла.

Поэтому я рекомендую явно создать ваш плотный массив, используя пару for петли. Для этого вам нужно знать, сколько элементов возможно в вашем результирующем векторе - назовите его N,

dense_vector = np.zeros((N, ), int)
for inner in mx:
    for index, value in inner:
        dense_vector[index] = value
Другие вопросы по тегам