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_list6つの要素を持つリストとして与えます。ただし、scipy.sparseを使用する場合

test_mat = lil_matrix(np.ones((4,6)))
test_list = test_mat[0,:].todense().tolist()

test_list1つの要素を持つリストとして与えられ、それは6つの要素を持ちます( test_list[0]6つの要素があります)。

誰かがこの違いをもたらす根本的なメカニズムを説明できますか? ありがとう

4

2 に答える 2

4

これは、 numpyとは対照的に、 numpyを常に持つlil_matrix.todense()numpy を返すためです。 numpyは、スライスで 1 つの行/列のみが選択されている場合にその次元を減らします。行列/配列の次元は、リストのリスト形式への変換で保持されます。matrixndim = 2ndarray

配列内の 2 次元の動作を確認するには、次のようにスライスします。

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)
于 2013-04-14T21:01:16.707 に答える
1

arrayこれは、および密行列の実装の結果ですarray

test_list = test_mat[0,:]

新しい 1D 配列を cat します。

ただし、疎行列に同じインデックスを付けると、結果は 1x6 の疎行列になります。これはまだ 2D 行列であり、1 つの次元の長さが 1 であることに注意してください。

は行列を表すリストを返すため、からtolist()取得した 1D オブジェクトの単純なリストとarray、疎行列の行を含む 2D の「リストのリスト」を取得します。

于 2013-04-14T21:03:16.600 に答える