在轴0上重复csr_matrix行以创建矩阵

时间:2015-12-11 14:16:03

标签: python numpy matrix scipy sparse-matrix

我有一个CSR格式的稀疏矩阵(scipy.sparse.csr_matrix),大约有100,000行和10,000列。行代表用户,列表示项目,矩阵中的值,该用户和项目的评级。

我正在尝试计算两个用户之间的相关性。所以我循环遍历每个用户(称之为user_a),并进行矩阵运算以获得user_a与所有其他用户的相关性。

第一步是生成当前用户矩阵。此矩阵包含当前用户的元素,屏蔽以匹配user_a的公共元素与所有其他用户。

目前我的代码是:

# ratings is the big original matrix
R = ratings.getrow(user_id)
user_matrix = sparse.csr_matrix(R)
user_matrix = user_matrix[numpy.array([0]).repeat(ratings.shape[0]),:]
user_matrix = user_matrix.multiply(ratings.astype(numpy.bool))

https://stackoverflow.com/a/25342156/947194

但对于只有500件物品的用户来说,这些线路需要4秒钟。我需要为每个用户运行它(100,000次)。所以它有点慢。

我尝试使用vstack生成user_matrix,但花了7秒

有没有办法减少这些线的时间?

1 个答案:

答案 0 :(得分:1)

对于<div style="width: 360px;" class="container"> <div class="row" style="height: 50px;"> <div class="col-xs-1" style="background: red"></div> <div class="col-xs-1" style="background: green"></div> <div class="col-xs-9" style="background: orange"></div> <div class="col-xs-1" style="background: yellow"></div> </div> </div> csr_matrix和整数ratings,这会得到与您的代码相同的结果:

user_id

但如果你的scipy版本太旧,它就不会起作用。我不记得哪个版本的scipy扩展了稀疏矩阵的广播行为以使其工作。