【问题标题】:scipy equivalent of numpy.prod() for sparse matricesscipy 等价于稀疏矩阵的 numpy.prod()
【发布时间】:2017-11-03 09:20:19
【问题描述】:

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

【问题讨论】:

  • 我认为没有等价物。大多数稀疏矩阵只实现元素操作。
  • 大部分(如果不是全部)值将为 0。整行或整列必须是密集的、非零的。

标签: python numpy scipy


【解决方案1】:

对于沿每一列的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]])

【讨论】:

  • csr_matrix.getnnz(axis=None) 可能有用;位 getmmz 使用 bincount。 :)
  • @hpaulj 谢谢!现在好多了!
  • 谢谢!我计时了,你的函数比转换为密集函数快 15 倍。
猜你喜欢
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2017-03-31
  • 2023-04-10
  • 2017-07-21
  • 2011-11-28
  • 2017-07-02
相关资源
最近更新 更多