python - 如何测试两个稀疏数组是否(几乎)相等?

标签 python numpy scipy sparse-matrix

我想检查两个稀疏数组是否(几乎)相等。而对于 numpy 数组,你可以这样做:

import numpy as np

a = np.ones(200)
np.testing.assert_array_almost_equal(a, a)

这不适用于稀疏数组,我可以理解(对于较小的矩阵或与数组大小相关的错误,返回错误 AttributeError: ravel not find )。是否有 scipy 相当于测试稀疏矩阵?我可以将稀疏矩阵转换为稠密矩阵并使用 numpy 测试函数,但有时由于(内存/大小)限制,这是不可能的。例如:

from scipy import sparse

b = sparse.rand(80000,8000,density=0.01)
type(b)  # <class 'scipy.sparse.coo.coo_matrix'>
c = b.toarray()  # ValueError: array is too big; `arr.size * arr.dtype.itemsize` is larger than the maximum possible size.

是否可以测试这些较大的 scipy 数组是否相等,或者我应该测试较小的样本?

最佳答案

假设我们不关心该数组中可能在容差值范围内的非零值,我们可以简单地获取行、列索引和相应的值,并查找索引之间的精确匹配,而allclose() 匹配值。

因此,实现将是 -

from scipy.sparse import find

def allclose(A, B, atol = 1e-8):

    # If you want to check matrix shapes as well
    if np.array_equal(A.shape, B.shape)==0:
        return False

    r1,c1,v1 = find(A)
    r2,c2,v2 = find(B)
    index_match = np.array_equal(r1,r2) & np.array_equal(c1,c2)

    if index_match==0:
        return False
    else:  
        return np.allclose(v1,v2, atol=atol)

这是另一个使用 nonzerodata 方法来替换 find 函数的方法 -

def allclose_v2(A, B, atol = 1e-8):
    # If you want to check matrix shapes as well
    if np.array_equal(A.shape, B.shape)==0:
        return False

    r1,c1 = A.nonzero()
    r2,c2 = B.nonzero()

    lidx1 = np.ravel_multi_index((r1,c1), A.shape)
    lidx2 = np.ravel_multi_index((r2,c2), B.shape)

    sidx1 = lidx1.argsort()
    sidx2 = lidx2.argsort()

    index_match = np.array_equal(lidx1[sidx1], lidx2[sidx2])
    if index_match==0:
        return False
    else:  
        v1 = A.data
        v2 = B.data        
        V1 = v1[sidx1]
        V2 = v2[sidx2]        
        return np.allclose(V1,V2, atol=atol)

我们可以在几个地方短路以进一步加快速度。在性能方面,我更关注仅值不同的情况。

关于python - 如何测试两个稀疏数组是否(几乎)相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47770906/

相关文章:

python - 在 Keras 中编写没有 y_true 的自定义损失函数

python - 如何将字符串的长度与同一列表中的整数进行比较?

python - 将一组 3 channel 图像从 Python 读取到二维数组以在 C 中使用的有效方法

python - 频率响应:Matlab Vs Python

python - scipy优化无法找到正确的结果

Python 列出函数外的列表

python - 检查字符串中具有不可预测分隔符的单词

python - 值错误: need more than 1 value to unpack how can i fix it

python - 如何使用 matplotlib 实时绘制条形图

python - 如何使用树状图处理大量数据