我有两个矩阵 mat1
和 mat2
是稀疏的(大多数条目为零),我对零值条目不感兴趣:我看从图论的角度来看矩阵,其中零表示节点之间没有边。
如何使用 scipy.sparse
矩阵高效仅在非零项之间获取最小值?
IE。相当于 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])
但这对于稀疏矩阵来说效率很低。
注意: similar question之前有人问过,但没有得到任何相关答案,有一个相关的PR在 scipy repo 上建议为 (arg)min/max 但不是 minimum
实现这个。
编辑:要指定更多,所需的行为将是可交换的,即此 nonzero-minimum
将仅采用两个矩阵之一中存在的所有值以及存在的条目的最小值在两个矩阵中
最佳答案
以防万一有人也在寻找这个,我当前的实现如下。 但是,如果有任何可以加快速度或减少内存占用的建议,我将不胜感激。
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))
关于python - 如何使用 scipy.sparse.csr_matrix.minimum 忽略隐式零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66277644/