首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列表转换为二维numpy矩阵

将列表转换为二维numpy矩阵
EN

Stack Overflow用户
提问于 2016-10-04 09:50:26
回答 3查看 71关注 0票数 0

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

代码语言:javascript
复制
[[196, 242, 3], 
 [186, 302, 3], 
 [22, 377, 1],
 [196, 377, 3],
 ....
 ]

第一列对应于用户(1:943),第二列对应于项目(1:1682)和他们对项目的投票。我想试试矩阵因式分解图书馆。我应该创建一个用户x项矩阵吗?如果是的话,我如何在python中创建一个矩阵,其中一个轴是用户的大小,另一个轴是条目的大小,值是用户的选票。

编辑:--我也检查nmf.py的实现,它作为输入一个2D矩阵,而不是列表或稀疏表示。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-04 17:06:13

您的数据看起来像一个列表:

代码语言:javascript
复制
In [168]: ll = [[196, 242, 3], 
     ...:  [186, 302, 3], 
     ...:  [22, 377, 1],
     ...:  [196, 377, 3]]

利用它创建一个数组--以便在以下操作中使用

代码语言:javascript
复制
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基(可选)

代码语言:javascript
复制
In [172]: A[:,:2] -= 1

这样,它就可以使用coo (或csr)格式快速而容易地定义稀疏矩阵( (data, (rows, cols)) )。迭代dok方法可以工作,但速度更快。

代码语言:javascript
复制
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包中,可以直接使用稀疏矩阵。

创建密集数组的一种直接方法是:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-10-04 09:54:21

好的。

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

代码语言:javascript
复制
mat = np.array(list_of_lists)
票数 1
EN

Stack Overflow用户

发布于 2016-10-04 10:00:14

下面是如何从集合项列表中创建稀疏矩阵:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39849208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档