You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何快速筛选列表中两两差值小于阈值的数值,能否用NumPy/SciPy实现?

基于NumPy的快速两两差值筛选方案

完全可以借助NumPy实现比纯Python两层循环快数十到数百倍的计算逻辑,尤其是数据规模较大时性能优势会非常明显,以下是两种不同适用场景的实现方案:


基础实现(和原代码逻辑完全对齐)

利用NumPy的广播机制一次性计算所有两两配对的差值,再通过掩码过滤重复配对和不符合阈值的结果:

import numpy as np

mylist = [2, 4, 54, 43, 43, 3]
closer_than = 2

# 转为NumPy数组
arr = np.array(mylist)
# 广播计算所有两两组合的绝对差值
diff_mat = np.abs(arr[:, None] - arr[None, :])
# 生成上三角掩码,仅保留i<j的配对,和原循环逻辑一致避免重复输出
upper_tri_mask = np.triu(np.ones_like(diff_mat, dtype=bool), k=1)
# 筛选符合阈值要求的坐标
row_idx, col_idx = np.where((diff_mat < closer_than) & upper_tri_mask)

# 输出结果
for i, j in zip(row_idx, col_idx):
    print("close values:", arr[i], arr[j])

该方案的输出和你提供的两层循环输出完全一致,长度在1000以内的列表可以直接用这个方案,代码简洁易维护。


大规模数据优化实现

上面的基础方案时间和空间复杂度都是O(n²),如果列表长度超过1万,全量差值矩阵会占用大量内存,这时候可以用排序+滑动窗口的方案把复杂度降到O(n log n),内存占用也大幅降低:

import numpy as np

mylist = [2, 4, 54, 43, 43, 3]
closer_than = 2

arr = np.array(mylist)
# 保留原始索引排序,避免排序后丢失原始位置信息
sorted_idx = np.argsort(arr)
sorted_arr = arr[sorted_idx]
n = len(arr)
res = []

for i in range(n):
    # 二分查找当前元素右侧第一个差值超过阈值的位置
    right_bound = np.searchsorted(sorted_arr, sorted_arr[i] + closer_than, side='right')
    # 遍历i+1到边界之间的所有元素,都是符合阈值要求的配对
    for j in range(i+1, right_bound):
        res.append((sorted_arr[i], sorted_arr[j]))

# 输出结果
for pair in res:
    print("close values:", pair[0], pair[1])

内容的提问来源于stack exchange,提问作者Talleros

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 18:09:03