2016-10-04 102 views
2

我有一個Python列表的列表。列表如下:將列表翻譯爲二維numpy矩陣

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

的第一列對應於用戶(1:943)和第二項(1:1682)和它們的票項目。我想嘗試矩陣分解library。我應該創建一個用戶x物品矩陣嗎?如果是的話,我怎樣才能創建一個類似python的矩陣,其中一個軸的大小是用戶的大小,另一個是物品的大小,值是用戶的投票數?

編輯:我也檢查了nmf.py的實現,這需要輸入一個二維矩陣,而不是一個列表或稀疏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]]) 

移位索引列0基(可選)

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

有了這個它是快速和容易使用定義一個稀疏矩陣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

當然。

您可以創建一個2維numpy的數組(你可以把一個矩陣),使用np.array功能:

mat = np.array(list_of_lists) 
+0

是的,我想因式分解的矩陣,而不是我有元組在開始,所以我需要創建o用戶矩陣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

我該如何使用分解的稀疏再聲抑制。我發現的所有代碼都是2D矩陣。 – konstantin