Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 用户、项目对的稀疏矩阵实现_Python 2.7_Numpy_Matrix_Scipy_Sparse Matrix - Fatal编程技术网

Python 2.7 用户、项目对的稀疏矩阵实现

Python 2.7 用户、项目对的稀疏矩阵实现,python-2.7,numpy,matrix,scipy,sparse-matrix,Python 2.7,Numpy,Matrix,Scipy,Sparse Matrix,我有一个数百万条记录的数据集,由100000名用户组成,他们购买了20000项的子集,格式如下: <user1, item1> <user1, item12> ... <user100,000, item> ... 我需要跟踪一个大小为(items x users)=(20000 x 100000)的矩阵,如果用户购买了该项目,则为1,否则为零。目前我使用的是传统的numpy数组,但在后面的步骤中处理这个需要花费很长时间。有谁能推荐一种有效的方法来使用S

我有一个数百万条记录的数据集,由100000名用户组成,他们购买了20000项的子集,格式如下:

<user1, item1>
<user1, item12>
...
<user100,000, item>

...

我需要跟踪一个大小为(items x users)=(20000 x 100000)的矩阵,如果用户购买了该项目,则为1,否则为零。目前我使用的是传统的numpy数组,但在后面的步骤中处理这个需要花费很长时间。有谁能推荐一种有效的方法来使用SciPy的稀疏矩阵之一,它仍然允许基于索引搜索矩阵?

这里有一个解决方案,用0和1构建一个密集的透视表,然后创建等效的稀疏矩阵。我选择了,但还有其他选择

import numpy as np
from scipy import sparse

ar = np.array([['user1', 'product1'], ['user2', 'product2'], ['user3', 'product3'], ['user3', 'product1']])

rows, r_pos = np.unique(ar[:,0], return_inverse=True)
cols, c_pos = np.unique(ar[:,1], return_inverse=True)

pivot_table = np.zeros((len(rows), len(cols)))
pivot_table[r_pos, c_pos] = 1

print(pivot_table)

# Convert the dense pivot table to a sparse matrix
s = sparse.lil_matrix(pivot_table)

# I can access the non-nul indices using nonzero
print(s.nonzero())
这使得:

[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 1.  0.  1.]]
(array([0, 1, 2, 2], dtype=int32), array([0, 1, 0, 2], dtype=int32))

附录

如果相关,下面是另一个不使用scipy的解决方案,但:

另外,请注意,这不会计算每个客户购买的产品数量(这可能很有趣,取决于您的用例和数据集)


您仍然可以使用此库搜索数据。

我实际上已经尝试使用pandas,但与numpy的二维阵列相比,它慢了30-40倍。问题不是创建一个由0和1组成的矩阵,而是通过索引高效地存储和读取这些元素。因此,SciPy软件包中的稀疏软件包看起来很完美,但缺少此类情况的清晰示例(注意,矩阵中包含的零比零多得多)。@Keyb0ardwarri0r我编辑了我的答案,添加了一个基于稀疏的透视表,它们与
r\u pos
c\u pos
数组不一样(可能的重新排序)?还可以查看
np.nonzero(pivot\u table)
。您可以直接使用
s=sparse.coo\u矩阵((np.one(r\u pos.shape,int),(r\u pos,c\u pos))
s.nonzero()
(基本上)返回
coo
矩阵的
row
col
属性。很容易从稠密矩阵创建稀疏natrix,也很容易在密集natrix之间切换。实验,这将是什么目标?在我的情况下:我需要创建此稀疏矩阵一次,然后稍后读取它以检查1存储在哪里。如果我首先创建它作为稠密矩阵,然后将其转换为稀疏矩阵,当我想要读取1时,我必须将其转换回稠密矩阵,对吗?您可以使用
nonzero()从稀疏矩阵获得1
,它给出了索引的元组。考虑到这一点,上述方法是否适用于您的用例?非常感谢,您更新的答案非常有用。我认为这可以适用于我的案例
In [34]: import pandas as pd

In [35]: df = pd.DataFrame([['user1', 'product1'], ['user2', 'product2'], ['user3', 'product3'], ['user3', 'product1']], columns = ['user', 'product'])

In [36]: df
Out[36]: 
    user   product
0  user1  product1
1  user2  product2
2  user3  product3
3  user3  product1

In [37]: df.groupby(['user', 'product']).size().unstack(fill_value=0)
Out[37]: 
product  product1  product2  product3
user                                 
user1           1         0         0
user2           0         1         0
user3           1         0         1