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

时间:2016-02-18 20:45:23

标签: python matrix set

我有两个矩阵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的set difference函数:

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

然而这不起作用 - 似乎csr_matrix似乎不能变成一个集合。所以如果我不使用集合,我怎样才能得到两个矩阵的集合差异?

2 个答案:

答案 0 :(得分:0)

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

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:对于2D稀疏矩阵,请使用:

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

答案 1 :(得分:0)

不确定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]]