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

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

4

2 回答 2

4

这是因为lil_matrix.todense()返回一个 numpy matrix,它总是有ndim = 2,而不是 numpy ndarray,它会在切片中只选择一行/列时减小它的维度。矩阵/数组的维数在转换为列表格式时保留。

要查看数组中的 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()

您将看到列表的 2d 列表,就像您从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)
于 2013-04-14T21:01:16.707 回答
1

这是array密集矩阵的实现的结果:当您索引arrayas in

test_list = test_mat[0,:]

你 cat 一个新的一维数组。

但是,当您对稀疏矩阵执行相同的索引时,结果是 1x6 稀疏矩阵。请注意,这仍然是一个二维矩阵,其中一维的长度恰好为 1。

由于tolist()返回一个表示矩阵的列表,因此您会得到一个简单的列表,用于从 中获得的 1D 对象array和包含稀疏矩阵行的 2D“列表列表”。

于 2013-04-14T21:03:16.600 回答