Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python将稀疏矩阵转换为稠密形式_Python_Numpy_Matrix_Scipy_Word Frequency - Fatal编程技术网

如何使用python将稀疏矩阵转换为稠密形式

如何使用python将稀疏矩阵转换为稠密形式,python,numpy,matrix,scipy,word-frequency,Python,Numpy,Matrix,Scipy,Word Frequency,我相信下面的矩阵是稀疏的。我尝试使用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),

我相信下面的矩阵是稀疏的。我尝试使用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,1],[2,1,1,1,2,1,1,1]。

您的源数据与SciPy中稀疏矩阵支持的任何内置格式都不匹配(请参见和),因此使用
.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

您的源数据与SciPy中稀疏矩阵支持的任何内置格式都不匹配(请参见和),因此在这里使用
.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

这里有一个非常简单的方法来满足你的要求:

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

基本上,它将嵌套元组中的每个值转换为字符串,并将所有这些字符串连接在一起,然后将其转换回整数。对
mx

的每个元素重复上述步骤,这里有一种非常简单的方法来满足您的要求:

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

基本上,它将嵌套元组中的每个值转换为字符串,并将所有这些字符串连接在一起,然后将其转换回整数。对mx的每个元素重复上述步骤,列表理解是最简单的方法:

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

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

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


您使用的是numpy还是scipy?嗨,Floris,我使用的是numpy,但似乎大多数人都使用scipy解决了类似的问题。@Tiger1是
mx
一个包含索引或值的矩阵?在SciPy中,稀疏矩阵的最大维数为2,这似乎不是你的情况……嗨,Saullo,索引后面跟着值。你需要使用
x.todense()
,而不是
x.dense()
。你是使用numpy还是SciPy?嗨,Floris,我使用numpy,但似乎大多数人都用scipy解决过类似的问题。@Tiger1是
mx
一个包含索引或值的矩阵?在SciPy中,稀疏矩阵的最大维数为2,这似乎不是你的情况……嗨,Saullo,索引后面跟着值。你需要使用
x.todense()
,而不是
x.dense()
。感谢@Imjohns3,当实际数据集包含数千个文档(最多一百万项)时,我怎么知道N的值?下面是一段代码,它可以做到这一点,还可以维护列表中项目的顺序:对于语料库中的文档,q=[]。\u tfidf:j=([i[1]对于文档中的i])q.append(j)噢,哇,这与我以为你在问的完全不同!在您的问题中详细说明这一点会很有帮助。您好,Imjohns3,谢谢您的解决方案。它起作用了,但每个项目都应该是一个列表;以逗号分隔的值。有关更新,请参阅问题。ThanksThanks@Imjohns3,当实际数据集包含数千个文档(最多一百万个项目)时,我如何知道N的值?下面是一段代码,它可以做到这一点,还可以维护列表中项目的顺序:对于语料库中的文档,q=[]。\u tfidf:j=([i[1]对于文档中的i])q.append(j)噢,哇,这与我以为你在问的完全不同!在您的问题中详细说明这一点会很有帮助。您好,Imjohns3,谢谢您的解决方案。它起作用了,但每个项目都应该是一个列表;以逗号分隔的值。有关更新,请参阅问题。感谢最后一个答案忽略了整个“这是什么样的数据”这条红鲱鱼,并进入了“这是你如何从输入中获得想要的输出”。@AKavall,感谢你的解决方案。这正是我一直在寻找的。最后一个答案忽略了“这是什么样的数据”这条红鲱鱼,而变成了“这是你从输入到输出的方式”。@AKavall,谢谢你的解决方案。这正是我要找的。