2013-08-03 50 views
1

我有以下矩阵,我认为是稀疏的。我试图转换到密集使用x.dense格式,但它从来没有工作。有关如何做到这一点的任何建议?,谢谢。如何将稀疏矩阵转换为使用python的密集形式

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

您是否使用numpy的或SciPy的? – Floris

+0

嗨弗洛里斯,我使用numpy,但似乎大多数人已经解决了类似的问题,使用scipy。 – Tiger1

+0

@ Tiger1是'mx'包含索引或值的矩阵吗?在SciPy中,您需要稀疏矩阵的最大维数为2,这似乎不是您的情况... –

回答

2

列表理解是最简单的方法:

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]] 
+0

最后一个答案忽略了整个“这是什么样的数据”红鲱鱼,并得到了“这里是你从输入你如何得到你想要的输出”。 – Floris

+0

@AKavall,感谢您的解决方案。它正是我所寻找的。 – Tiger1

1

源数据真的不符合任何在SciPy的(见http://docs.scipy.org/doc/scipy/reference/sparse.htmlhttp://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 
+0

Thanks @ Imjohns3,当实际数据集包含数千个文档(多达一百万个项目)时,如何知道N的值?这里是一个代码,它也可以维护列表中的项目顺序:q = [] for doc in corpus_tfidf: j =([i [1] for i in doc]) q.append(j ) – Tiger1

+0

哦,哇,这与我以为你问的完全不同!在你的问题中指定这将是有帮助的。 – lmjohns3

+0

嗨Imjohns3,感谢您的解决方案。它工作,但每个项目应该是一个列表;值以逗号分隔。请参阅更新的问题。谢谢 – Tiger1

1

这里是做你问了一个非常哈克的方式:

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

基本上它从嵌套的元组的每个值转换成字符串并连接所有这些串起来,然后将其转换那回到一个整数。重复每个元素mx

相关问题