python - 在 scipy 中连接稀疏矩阵中的特定行
问题描述
我有一个带有 I 行和 U 列的大型稀疏矩阵(使用 scipy.sparse),U 比 I 大得多。我有一个范围为 0:I 的 U 随机数列表。我想创建一个新的稀疏矩阵,它将是一个 U * U 稀疏矩阵,用户 u 的行将保存原始稀疏矩阵的第 i 行中的所有 U 值。例如,如果原始矩阵是 3*5 矩阵:
0,0,2,1,0
0,0,3,4,1
1,1,0,2,0
随机数列表为 [0,0,2,1,2]
结果矩阵应该是:
0,0,2,1,0
0,0,2,1,0
1,1,0,2,0
0,0,3,4,1
1,1,0,2,0
我现在正在使用这段代码,非常慢:
for u in range(U):
i= random_indices[u]
if u == 0:
output_sparse_matrix = original_sparse_matrix[i, :]
else:
output_sparse_matrix = vstack((output_sparse_matrix,
original_sparse_matrix[i, :]))
关于如何更快地完成此操作的任何建议?
更新 我使用了 Jérôme Richard 的建议,但在一个循环中 - 因为我遇到了内存不足的错误。这是有效的解决方案:
bins = np.array_split(random_indices, 10)
output_sparse_matrix = original_sparse_matrix[bins[0]]
for bin in bins[1:10]:
output_sparse_matrix = vstack((output_sparse_matrix ,original_sparse_matrix[bin]))
解决方案
vstack
为每次迭代创建一个新矩阵。这是减速的主要来源,因为算法的复杂性是O(U^3)
. 您可以将新行追加到 Python 列表中,然后追加行vstack
列表。或者,更好的方法是使用以下 Numpy 表达式:
original_sparse_matrix[random_indices, :]
推荐阅读
- sql - BigQuery:从表连接引起的子选择中删除记录
- javascript - `data-fir-if` HTML 标签引用了什么?
- node.js - MonogDB 会在一段时间后自动重置保存的值
- python - ValueError:无法将字符串转换为浮点数:'���'
- java - Java - 学习同步的困难
- arrays - 将输入添加到数组时遇到问题
- ios - 在自定义视图类中从 Superview 中关闭 UIVIew 函数
- regex - 创建为 dest_ip 和 dest_port 创建组匹配的单个正则表达式
- python - 反转字符串但将字符对保持在一起
- amazon-lex - 每次自定义槽的内容发生变化时,是否必须重新构建/发布 Amazon Lex 实例?