我想检查两个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
优化函数代替?
非常感谢
答案 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
以下文档参考帮助我到达了那里: CSR Sparse Matrix Methods CSC Sparse Matrix Methods Numpy arrays_equal method SciPy todense method