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

ome*_*rbp 14 python numpy scipy

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

如果我做:

x.__eq__(y)
Run Code Online (Sandbox Code Playgroud)

我明白了:

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().
Run Code Online (Sandbox Code Playgroud)

但是,这很好用:

assert (z in x for z in y)
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?也许使用一些scipy优化的功能?

非常感谢

hpa*_*ulj 23

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

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
Run Code Online (Sandbox Code Playgroud)

这将检查不等式数组的稀疏性.

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

您需要一个相对较新的版本来使用这样的逻辑运算符.你试图x.__eq__(y)在某个if表达式中使用,还是从那个表达式中得到错误?

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

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

np.allclose(a.A, b.A)
Run Code Online (Sandbox Code Playgroud)

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

  • 我想知道为什么 `numpy.array_equal` 对于两个稀疏输入似乎没有按预期工作? (3认同)
  • scipy 稀疏矩阵不是 `np.ndarray`。它是一个完全不同的对象类,将其数据存储在数组中。对于小样本矩阵,尝试使用 `np.asarray(M)`。看看结果。另请查看 `np.array_equal`(它的 Python)的代码。一般来说,`numpy` 函数不适用于稀疏矩阵。 (2认同)