import numpy as np
from scipy.sparse import lil_matrix
使用numpy我得到了
test_mat = (np.ones((4,6)))
test_list = test_mat[0,:].tolist()
将test_list
作为包含6个元素的列表。但是,我使用scipy.sparse
test_mat = lil_matrix(np.ones((4,6)))
test_list = test_mat[0,:].todense().tolist()
将test_list
作为一个列表,其中包含一个元素,而这个元素又有6个元素(test_list[0]
有6个元素)。
有人可以向我解释导致这种差异的潜在机制吗? 感谢
答案 0 :(得分:4)
这是因为lil_matrix.todense()
会返回一个numpy matrix
,它总是ndim = 2
,而不是numpy ndarray
,只会在一行时减少其维度在切片中选择col。矩阵/数组的维度在转换为列表列表格式时保留。
要查看数组中的2d行为,请将其切片为:
test_mat = np.ones((4,6))
test_list = test_mat[0:1,:].tolist()
或者,将其作为:
启动test_mat = np.matrix(np.ones((4,6)))
test_list = test_mat[0:1,:].tolist()
您将从lil_matrix
以下是之前转换为列表时的内容:
In [137]: ma = np.ones((4,6))
In [138]: mm = np.matrix(np.ones((4,6)))
In [139]: ms = lil_matrix(np.ones((4,6)))
In [141]: ma[0,:]
Out[141]: array([ 1., 1., 1., 1., 1., 1.])
In [142]: mm[0,:]
Out[142]: matrix([[ 1., 1., 1., 1., 1., 1.]])
In [143]: ms[0,:].todense()
Out[143]: matrix([[ 1., 1., 1., 1., 1., 1.]])
使用不减小尺寸的切片:
In [144]: ma[0:1,:]
Out[144]: array([[ 1., 1., 1., 1., 1., 1.]])
上面的方括号数是关键。看看他们的形状:
In [145]: ma[0:1,:].shape
Out[145]: (1, 6)
In [146]: ma[0,:].shape
Out[146]: (6,)
In [147]: mm[0,:].shape
Out[147]: (1, 6)
In [148]: ms[0,:].shape
Out[148]: (1, 6)
答案 1 :(得分:1)
这是array
和密集矩阵的实施结果:
当您将array
索引为
test_list = test_mat[0,:]
你得到一个新的1D阵列。
但是,当您对稀疏矩阵进行相同的索引时,结果是1x6稀疏矩阵。请注意,这仍然是一个2D矩阵,其中一个维度的长度恰好为1。
由于tolist()
返回表示矩阵的列表,因此您可以获得从array
获得的1D对象的简单列表以及2D"列表列表"包含稀疏矩阵的行。