稀疏矩阵的scumpy等价于numpy.prod()

时间:2017-06-02 04:34:42

标签: python numpy scipy

我正在寻找与scipy offer(numpy.prod)的稀疏表示一起使用的等效scipy.sparse。具体来说,我正在尝试沿单轴计算产品。我可以通过首先转换为密集(M.todense().prod(axis=0))来实现,但我正在寻找更高效的东西。

1 个答案:

答案 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]])