我有两个矩阵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似乎不能变成一个集合。所以如果我不使用集合,我怎样才能得到两个矩阵的集合差异?
答案 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]]