python - 如何使用 scipy.sparse.csr_matrix.minimum 忽略隐式零?
问题描述
我有两个矩阵mat1
,mat2
它们是稀疏的(大多数条目为零),我对零值条目不感兴趣:我从图论的角度看待矩阵,其中零表示节点之间没有边.
如何仅使用矩阵有效地获取非零条目之间的最小值?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
将采用仅存在于两个矩阵之一中的所有值以及两个矩阵中存在的条目的最小值
解决方案
以防万一有人也在寻找这个,我当前的实现如下。但是,我将不胜感激任何可以加快速度或减少内存占用的提议。
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))
推荐阅读
- node.js - NPM 命令配置损坏
- python - 类对象不可调用
- javascript - 如何公开属性对象的方法,就好像它们是对象自己的方法一样?JavaScript
- tensorflow - 如何保存在 TPU 上训练的 Keras 模型?
- c# - 如何从 Azure AD 获取自定义属性
- spring - 如何在控制台中禁用休眠登录?
- ios - iOS 中视图的人类可读标签/ID
- python - 将 pandas 数据帧转换为 networkx 图
- python - 在具有固定范围的新列中汇总 126 个先前的方差预测值
- php - 修改 .htaccess 以使用 php7.2 而不是 php5.6 后出现 500 错误