numpy array.tolist()和scipy.sparse tolist()之间有什么区别

时间:2013-04-14 20:52:35

标签: python numpy scipy

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个元素)。

有人可以向我解释导致这种差异的潜在机制吗? 感谢

2 个答案:

答案 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

中看到第2个列表列表

以下是之前转换为列表时的内容:

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"列表列表"包含稀疏矩阵的行。