如何获得两个稀疏矩阵的集差?

How can I get the set difference of two Sparse Matrices?

我有两个矩阵 A 和 B。我想找出它们之间的集合差异:在 A 中但不在 B 中的所有元素的集合。结果矩阵必须具有相同的形状,所以另一个表达方式是 A 和 B 中都存在的元素必须设置为零。例如,使用以下矩阵:

import numpy as np
from scipy.sparse import csr_matrix

A = csr_matrix([[1, 2, 3, 4, 5]])
B = csr_matrix([[6, 0, 7, 0, 9]])

结果将是:

C = [[0, 2, 0, 4, 0]]

到目前为止,我一直在尝试使用 python 的集差函数:

def set_difference(a,b):
    a = set(a)
    b = set(b)
    c = a.difference(b)
    return c

但是这不起作用 - csr_matrix 似乎不能变成集合。那么如果我不使用集合,我怎么能得到两个矩阵的集合差呢?

看来您使用的是普通矩阵,而不是稀疏矩阵。根据您的问题描述,以下方法可行:

A = [1, 2, 3, 4, 5]
B = [6, 0, 7, 0, 9]
C = [A[i] if not B[i] else 0 for i in range(len(A))]

任何非零值的计算结果为 "true",因此当同一索引的 B[i] 为零时,这将创建所有 A[i] 值的列表,否则它会为该索引填充零。

编辑:使用 csr_matrices 试试这个语法:

 C = csr_matrix([A[0,i] if not B[0,i] else 0 for i in range(A.size)])

EDIT2:对于二维稀疏矩阵,使用这个:

 C = csr_matrix( [ [A[i,j] if not B[i,j] else 0 for i in range(A.shape[0]) ] for j in range(a.shape[1]) ])

不确定 csr_matrix 是如何适应它的,但你可以在 A:

上使用遮罩
from scipy.sparse import csr_matrix

A = csr_matrix([[1, 2, 3, 4, 5]])
B = csr_matrix([[6, 0, 7, 0, 9]])
_A = A.toarray()
_B = B.toarray()


_A[_B != 0] = 0

print(_A)
[[0 2 0 4 0]]