为何scipy.sparse.csr_matrix支持广播乘法却不支持广播减法?
关于scipy稀疏矩阵平铺与运算的疑问
1. 乘法广播实现平铺,但减法报错的原因
我尝试理解scipy稀疏矩阵的平铺方法,其中最高赞的实现是通过矩阵乘法完成单行平铺:
from scipy.sparse import csr_matrix import numpy as np sparse_row = csr_matrix([[0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0]]) repeat_number = 3 repeated_row_matrix = csr_matrix(np.ones([repeat_number,1])) * sparse_row
将结果转为稠密矩阵后,输出符合预期:
print(f"repeated_row_matrix.todense() =\n{repeated_row_matrix.todense()}")
输出:
repeated_row_matrix.todense() = [[0 0 0 0 0 1 0 1 1 0 0 0] [0 0 0 0 0 1 0 1 1 0 0 0] [0 0 0 0 0 1 0 1 1 0 0 0]]
这里(3,1)的全1稀疏矩阵和(1,12)的单行稀疏矩阵相乘,得到了(3,12)的平铺矩阵,行为类似numpy的广播。但换成减法时:
sparse_row = csr_matrix([[0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0]]) repeat_number = 3 repeated_row_matrix = csr_matrix(np.ones([repeat_number,1])) - sparse_row print(f"repeated_row_matrix.todense() =\n{repeated_row_matrix.todense()}")
会直接报错:
ValueError: inconsistent shapes
这是预期行为吗?如果是,原因是什么?我猜测乘法的非零元素数最多是两个矩阵非零元素数的最小值,而减法最坏会是两者之和,这能解释行为差异吗?
2. 稀疏矩阵单行向量减法的优化需求
我需要实现从稀疏矩阵中减去单行向量(用于K-medoids的稀疏实现),目前的做法是先通过乘法广播平铺行再做减法,但肯定有更高效的方法,希望得到优化建议。
3. 索引式平铺方法的原理
评论里提到一种更简洁的平铺方法:
sparse_row[np.zeros(repeat_number),:]
这个方法有效,但我不清楚它的原理——如果是numpy数组,这个操作不会实现平铺。请问这个操作对应的scipy稀疏矩阵功能是什么?有没有相关文档说明?
内容的提问来源于stack exchange,提问作者pandamonium
相关产品推荐
相关产品推荐

