如何获得两个稀疏矩阵的集差?
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]]
我有两个矩阵 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]]