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

时间:2017-12-12 10:57:11

标签: 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 found)。是否有scipy等效于测试稀疏矩阵?我可以将我的稀疏矩阵转换为密集矩阵并使用numpy测试函数,但有时由于(内存/大小)约束这是不可能的。 E.g:

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数组是否相等,还是应该测试较小的样本?

1 个答案:

答案 0 :(得分:2)

假设我们不关心可能在容差值范围内的数组中的非零值,我们可以简单地获取行,col索引和相应的值,并查找索引之间的精确匹配,同时ionic cordova build android --release 匹配值。

因此,实施将是 -

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) nonzero方法替换data函数的另一种方法 -

find

我们可以在少数地方短路以进一步加速。在表现方面,我更关注的是只有价值观不同的情况。