Python中如何判断一维子数组是否存在于目标二维数组中
二维数组中判断指定二元子数组是否存在的实现方案
针对你数百到4000量级的数对存储场景,有几种简洁高效的实现方式,不需要依赖异常捕获逻辑:
纯Python原生最简实现
不需要调用index()配合异常捕获,Python列表原生的成员运算符in就可以直接匹配子列表,找不到元素时会直接返回False,完全符合你的需求:
# 注意不要用all做变量名,all是Python内置的全判断函数,容易引发命名冲突 all_arr = [[1,-1], [1,0], [1,1], [2,-1], [2,0], [2,1]] def isValid(all_arr, target): return target in all_arr
调用效果完全符合预期:
isValid(all_arr, [1,1]) # 返回True isValid(all_arr, [1,100]) # 返回False
这个实现对于4000个元素以内的场景性能完全足够,单次查询是线性遍历,比对开销极低,代码可读性也最好。
高频查询优化方案
如果需要对同一个二维数组做多次存在性判断,可以先做一次预处理,把数对转成可哈希的元组存入集合,后续单次查询时间复杂度可以降到O(1),查询效率提升非常明显:
# 只需要预处理一次 lookup_set = {tuple(pair) for pair in all_arr} def isValid(target): return tuple(target) in lookup_set
这个方案适合查询频次高的场景,预处理的开销会被后续多次查询的收益摊薄。
Numpy正确实现方式
你之前用isin()、in1d()无法生效,是因为这两个函数默认做逐元素匹配,不会按整行做比对。如果要使用numpy实现整行匹配,可以用如下写法:
import numpy as np all_np = np.array([[1,-1], [1,0], [1,1], [2,-1], [2,0], [2,1]]) def isValid(all_np, target): return (all_np == target).all(axis=1).any()
逻辑是先逐元素对比得到布尔矩阵,沿行方向判断是否整行值完全匹配,最后判断是否存在至少一行匹配结果。这个方案在数据量达到十万级以上时,向量化运算的性能优势会比较明显,你当前的小规模数据场景下没必要使用。
内容的提问来源于stack exchange,提问作者Demis
相关产品推荐
相关产品推荐

