检查两个scipy.sparse.csr_matrix是否相等

时间:2015-06-06 16:22:24

标签: python numpy scipy

我想检查两个csr_matrix是否相等。

如果我这样做:

x.__eq__(y)

我明白了:

raise ValueError("The truth value of an array with more than one "
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all().

然而,这很有效:

assert (z in x for z in y)

有更好的方法吗?可能使用一些scipy优化函数代替?

非常感谢

2 个答案:

答案 0 :(得分:16)

我们可以假设它们的形状相同吗?

In [202]: a=sparse.csr_matrix([[0,1],[1,0]])
In [203]: b=sparse.csr_matrix([[0,1],[1,1]])
In [204]: (a!=b).nnz==0   
Out[204]: False

这会检查不等式数组的稀疏性。

如果您尝试a==b(至少第一次使用它),它会为您提供效率警告。那是因为所有那些必须测试所有那些零。

您需要一个相对较新的版本来使用这样的逻辑运算符。您是否尝试在某些x.__eq__(y)表达式中使用if,或者您是否仅从该表达式中获得错误?

通常,您可能希望先检查几个参数。相同shape,相同nnz,相同dtype。你需要小心浮动。

对于密集数组np.allclose是测试相等性的好方法。如果稀疏数组不是太大,那也可能是好的

np.allclose(a.A, b.A)

allclose使用all(less_equal(abs(x-y), atol + rtol * abs(y)))。您可以使用a-b,但我怀疑这也会产生效率警告。

答案 1 :(得分:0)

科学与数字混合法

最适合我的情况的是(使用通用代码示例):

bool_answer = np.arrays_equal(sparse_matrix_1.todense(), sparse_matrix_2.todense())

您可能需要注意np.arrays_equal

中的equal_nan参数

以下文档参考帮助我到达了那里: CSR Sparse Matrix Methods CSC Sparse Matrix Methods Numpy arrays_equal method SciPy todense method