python - 如何使用 scipy.sparse.csr_matrix.minimum 忽略隐式零?

标签 python scipy sparse-matrix

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

如何使用 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/

相关文章:

python - python中线性插值的逻辑错误

c++ - 编织内联类型转换(python)

python - 带索引的 Numpy 分配

python - 在 Python 3 中处理大数以计算组合

python - 通过python在git中自动提交

python - 使用稀疏矩阵与 sklearn 亲和性传播

java - Weka 打印稀疏 arff 文件

android - 将数组列表转换为稀疏数组

python - 在 Chaco 中动态创建地 block

python - 使用 python-numpy 放大图像