首页 > 解决方案 > 如何使用 scipy.sparse.csr_matrix.minimum 忽略隐式零?

问题描述

我有两个矩阵mat1mat2它们是稀疏的(大多数条目为零),我对零值条目不感兴趣:我从图论的角度看待矩阵,其中零表示节点之间没有边.

如何仅使用矩阵有效地获取非零条目之间的最小值?scipy.sparse即等效的mat1.minimum(mat2)将忽略隐式零。

使用密集矩阵,很容易做到:

import numpy as np
nnz = np.where(np.multiply(mat1, mat2))
m = mat1 + mat2
m[nnz] = np.minimum(mat1[nnz], mat2[nnz])

但是对于稀疏矩阵,这将是非常低效的。

注意:之前有人问过类似的问题,但没有得到任何相关的答案,并且 scipy repo 上有一个相关的PR,它提出了一个用于 (arg)min/max 但不用于minimum.

编辑:指定更多所需的行为将是可交换的,即这nonzero-minimum将采用仅存在于两个矩阵之一中的所有值以及两个矩阵中存在的条目的最小值

标签: pythonscipysparse-matrix

解决方案


以防万一有人也在寻找这个,我当前的实现如下。但是,我将不胜感激任何可以加快速度或减少内存占用的提议。

s = mat1.multiply(mat2)
s.data[:] = 1.

a1 = mat1.copy()
a1.data[:] = 1.
a1 = (a1 - s).maximum(0)

a2 = mat2.copy()
a2.data[:] = 1.
a2 = (a2 - s).maximum(0)

res = mat1.multiply(a1) + mat2.multiply(a2) + \
      mat1.multiply(s).minimum(mat2.multiply(s))

推荐阅读