将列表翻译为2D numpy矩阵

时间:2016-10-04 09:50:27

标签: python numpy matrix

我在python中有一个列表列表。列表如下:

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

第一列对应于用户(1:943),第二列对应于项目(1:1682)及其对项目的投票。我想尝试矩阵分解library。我应该创建用户x项矩阵吗?如果是,我怎么能在python中创建一个矩阵,一个轴的大小是用户的大小,另一个是项目的大小,值是用户的投票?

编辑:我还检查了nmf.py的实现,它需要输入2D矩阵而不是列表或稀疏的represantation。

3 个答案:

答案 0 :(得分:1)

不确定

您可以使用np.array函数创建一个二维numpy数组(可以将其视为一个矩阵):

mat = np.array(list_of_lists)

答案 1 :(得分:1)

以下是如何从设置项列表中创建稀疏矩阵:

Caltype:
Professional = 0
Administrator = 1
Basic = 2
Device Professional = 3
Device Basic = 4
Essential = 5
Device Essential = 6
Enterprise = 7
Device Enterprise = 8

Accessmode:
Read-write = 0
Administrator = 1
Read = 2

答案 2 :(得分: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 base(可选)

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