我有以下矩阵,我认为是稀疏的。我尝试使用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]]
答案 0 :(得分: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]]
答案 1 :(得分:1)
您的源数据与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
答案 2 :(得分:1)
这是一个非常黑客的方式来做你想要的:
dense = [[int(''.join(str(val) for _, val in doc))] for doc in mx]
基本上,它将嵌套元组中的每个值转换为字符串,并将所有这些字符串连接在一起,然后将其转换回整数。对mx
的每个元素重复。