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

2024-10-09 20:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个稀疏的矩阵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])

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

NB:asimilar question以前被问过,但没有得到任何相关的答案,并且scipy repo上有一个相关的PR,它建议为(arg)min/max而不是为minimum实现此功能

编辑:若要指定更多,所需的行为将是可交换的,即nonzero-minimum将获取两个矩阵中仅一个矩阵中存在的所有值以及两个矩阵中存在的项的最小值


Tags: importnumpy节点np条目矩阵scipysparse
1条回答
网友
1楼 · 发布于 2024-10-09 20:23:15

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

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))

相关问题 更多 >

    热门问题