【问题标题】:Check if two scipy.sparse.csr_matrix are equal检查两个 scipy.sparse.csr_matrix 是否相等
【发布时间】:2015-08-21 11:53:50
【问题描述】:

我想检查两个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 优化功能?

非常感谢

【问题讨论】:

  • 你试过(x==y).all()吗?只是猜测......
  • == 和 all 不是稀疏矩阵的实际计算。大多数元素为 0。x==x 将生成一个包含所有 True 的矩阵,它不再是稀疏的。

标签: python numpy scipy


【解决方案1】:

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

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(至少第一次使用它),它会给你一个效率警告。那是因为它必须测试所有这些零。它不能充分利用稀疏性。

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

一般来说,您可能需要先检查几个参数。相同的shape,相同的nnz,相同的dtype。你需要小心浮动。

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

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

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

【讨论】:

  • 我能得到的最好的建议,谢谢!
  • 我想知道为什么 numpy.array_equal 对于两个稀疏输入似乎没有按预期工作?
  • scipy 稀疏矩阵不是np.ndarray。它是一个完全不同的对象类,将其数据存储在数组中。尝试np.asarray(M) 获取小样本矩阵。看看结果。另请查看np.array_equal 的代码(它的 Python)。通常numpy 函数不适用于稀疏矩阵。
【解决方案2】:

SciPy 和 Numpy 混合方法

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-09
    • 2020-02-12
    • 2012-10-10
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多