我想检查两个稀疏数组是否(几乎)相等。而对于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数组是否相等,还是应该测试较小的样本?
答案 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
我们可以在少数地方短路以进一步加速。在表现方面,我更关注的是只有价值观不同的情况。