python-3.x - 如何比较两个大小不同但浮点数近似的数组?[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)
解决方案
您可以使用广播。这将创建每个元素之间的成对差异数组,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))
推荐阅读
- c# - Web服务文件流到字节[]到文件流到pdf失败C#
- c++ - 在特定条件下跳过 std::for_each 中的迭代
- c++ - 在一次 pnorm 调用中访问普通 CDF 的两个尾部
- ember.js - options.scales.yAxes[0].ticks.callback 没有在 ember-cli-chart 中动态更新
- laravel - 如何使用数据库将 laravel 项目上传到子域
- c# - 使用 FCM(Firebase 云消息传递)通过 C# 向 iOS 发送推送
- swift - bindMemory(to:capacity:) 实际上是做什么的?
- javascript - iOS 键盘推送 jQuery-confirm 提示视图
- sql - 如何使用 IF 条件与 SQL 比较日期
- r - 通过 newssanchor 包提取全文文本 [in R]