首页 > 解决方案 > 如何比较两个大小不同但浮点数近似的数组?[Python3]

问题描述

如何比较两个大小不同但浮点数近似的数组?例如:

# I have two arrays
a = np.array( [-2.83, -2.54, ..., 0.05, ..., 2.54, 2.83] )
b = np.array( [-3.0, -2.9, -2.8, ..., -0.1, 0.0, 0.1, ..., 2.9, 3.0] )
# wherein len( b ) > len( a )

我需要的是索引 where (考虑到两个列表中的这两个值)

math.isclose( -2.54, -2.5, rel_tol=1e-1) == True

我需要的答案是

list_of_index_of_b = [1, 5, ..., -2]

list_of_index_of_b是一个带有“坐标”的列表,其中 的特定元素b近似于 的某个元素a。并不是所有的元素a都有一个近似的 in b。还: len(list_of_index_of_b) == len(a)

标签: python-3.xnumpyfloating-pointcompareprecision

解决方案


您可以使用广播。这将创建每个元素之间的成对差异数组,a然后b您可以检查指定的容差。

当然,从复杂性的角度来看,这在计算上是低效的,因为您构建了一个大小数组|a|*|b|并将每个成对距离与容差进行比较,即使其中一次差异已经足够小。也就是说,如果其中一个|a|or|b|相对较小,那么这种方法可能会非常快,因为它是纯 numpy 并且不需要循环。

a = np.array([1,5,6,7])
b = np.array([1.1,2,3,4.8,4.9,5,8])

rtol = 0.15

diff = a - b[:,None]
mask2d = (1/np.abs(b))*np.abs(a - b[:,None]) < rtol

mask = np.any(mask2d,axis=1)

这可以合并为一行:

indices = np.where(np.any((1/np.abs(b))*np.abs(a-b[:,None]) < rtol,axis=1))

推荐阅读