2016-10-04 18 views
2

私はリストのリストをpythonで持っています。以下れるリスト:アイテム(1:1682)への第2アイテムへとその投票:リストを2D numpy行列に変換する

[[196, 242, 3], 
[186, 302, 3], 
[22, 377, 1], 
[196, 377, 3], 
.... 
] 

最初の列は、ユーザ(943 1)に対応します。私は行列分解を試してみたいですlibrary。ユーザーxアイテムマトリックスを作成する必要がありますか?はいの場合、どのように私はPythonのような行列を作成することができます1つの軸は、ユーザーのサイズの他の1つのアイテムのサイズとユーザーの投票値ですか?

EDIT: Iはまた、入力としてnmf.pyれるrequirの実装2次元マトリクスではなく、リストまたは疎represantationをチェックします。

+0

私がいないすべての組み合わせが発生したと仮定し、その –

答えて

1

あなたのデータは、リストのリストのようになります。

In [168]: ll = [[196, 242, 3], 
    ...: [186, 302, 3], 
    ...: [22, 377, 1], 
    ...: [196, 377, 3]] 

それから配列する - 次の操作の便宜上を

In [169]: A = np.array(ll) 
In [170]: ll 
Out[170]: [[196, 242, 3], [186, 302, 3], [22, 377, 1], [196, 377, 3]] 
In [171]: A 
Out[171]: 
array([[196, 242, 3], 
     [186, 302, 3], 
     [ 22, 377, 1], 
     [196, 377, 3]]) 

シフトこれにより

In [172]: A[:,:2] -= 1 

それは迅速であり、簡単に使用して疎行列を定義する(オプション)0ベースのインデックス列coo(またはcsr)の形式で、(data, (rows, cols))です。反復的なdokのアプローチが有効ですが、これは高速です。

In [174]: from scipy import sparse 
In [175]: M = sparse.csr_matrix((A[:,2],(A[:,0], A[:,1])), shape=(942,1681)) 
In [176]: M 
Out[176]: 
<942x1681 sparse matrix of type '<class 'numpy.int32'>' 
    with 4 stored elements in Compressed Sparse Row format> 
In [177]: print(M) 
    (21, 376) 1 
    (185, 301) 3 
    (195, 241) 3 
    (195, 376) 3 

M.Aこのスパース行列から密な配列を作成します。いくつかのコード、特にsckit-learnパッケージでは、スパース行列を直接使用できます。

高密度アレイを作成するための直接的な方法は次のとおりです。

In [183]: N = np.zeros((942,1681),int) 
In [184]: N[A[:,0],A[:,1]]= A[:,2] 
In [185]: N.shape 
Out[185]: (942, 1681) 
In [186]: M.A.shape 
Out[186]: (942, 1681) 
In [187]: np.allclose(N, M.A) # it matches the sparse version 
Out[187]: True 
1

あなたはnp.array機能を使用して、(あなたが行列として扱うことができます)2次元numpyの配列を作成することができます。ここでは

mat = np.array(list_of_lists) 
+0

はい、私は行列を因数分解したい...スパース行列を検索し、私は持っていないタプル最初はユーザーxアイテムを持つマトリックスを作成する必要があります – konstantin

1

を使用すると、設定項目のリストからスパース行列を作成する方法であります:

data = [ 
    [196, 242, 3], 
    [186, 302, 3], 
    [22, 377, 1], 
    [196, 377, 3], 
    .... 
] 

user_count = max(i[0] for i in data) + 1 
item_count = max(i[1] for i in data) + 1 

data_mx = scipy.sparse.dok_matrix((user_count, item_count)) 
for (user, item, value) in data: 
    data_mx[user, item] = value 
+0

私はスパースdata_mxを直接使うことができますか、それとも普通の配列マトリックスとして変換する必要がありますか? – konstantin

+0

どのように分解の疎なrepresantationを使用することができます。私が見つけたすべてのコードは2次元マトリックス用です。 – konstantin

関連する問題