我有两个稀疏矩阵mat1
和mat2
(大多数元素都是零),我对零值元素不感兴趣:我从图论的Angular 来看待矩阵,其中零意味着节点之间没有边。
如何 * 有效地 * 使用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])
但是,这对于稀疏矩阵来说是非常低效的。
**注意:**以前曾询问过similar question,但未得到任何相关答案,scipy存储库上有一个相关的PR,它建议为(arg)min/max实现此功能,但不建议为minimum
实现此功能。
编辑:为了更详细地说明,所需行为是可交换的,即nonzero-minimum
将取两个矩阵中仅一个矩阵中存在的所有值以及两个矩阵中存在的元素的最小值
2条答案
按热度按时间46scxncf1#
为了防止有人也在寻找这个,我目前的实现如下。然而,我会感谢任何建议,将加快这一点或减少内存占用。
ltskdhd12#
如果稀疏非零值为正数,则使用
maximum
的正确 UNION 行为的另一种方法可能是 * 取反并使其为正数 *。按照你的指导,我明确地用
data
来做了一些事情。由于四舍五入,可能会有不精确之处
还有一个建议是使用稀疏内部函数。一个相当通用的函数是
sp.find
,它返回 anything 的非零元素。因此,您也可以尝试使用
minimum
,它也可以处理负值,如下所示: