我正在寻找与scipy offer(numpy.prod)的稀疏表示一起使用的等效scipy.sparse。具体来说,我正在尝试沿单轴计算产品。我可以通过首先转换为密集(M.todense().prod(axis=0)
)来实现,但我正在寻找更高效的东西。
答案 0 :(得分:2)
对于每列的prod
减少操作,即axis=0
,对于具有所有非零的列,我们只有非零输出。我们可以使用这个事实来制作一个自定义推出版本,如此 -
def sparse_prod_axis0(A):
# Valid mask of row length that has all non-zeros along each col
valid_mask = A.getnnz(axis=0)==A.shape[0] # Thanks to @hpaulj on this!
# Initialize o/p array of zeros
out = np.zeros(A.shape[1],dtype=A.dtype)
# Set valid positions with prod of each col from valid ones
out[valid_mask] = np.prod(A[:,valid_mask].A,axis=0)
return np.matrix(out)
示例运行 -
In [92]: from scipy.sparse import csr_matrix
...: a = np.random.randint(0,4,(5,10))
...: A = csr_matrix(a)
...:
In [93]: (A.todense().prod(axis=0))
Out[93]: matrix([[ 0, 0, 6, 48, 0, 0, 0, 0, 72, 0]])
In [94]: sparse_prod_axis0(A)
Out[94]: matrix([[ 0, 0, 6, 48, 0, 0, 0, 0, 72, 0]])