如何在Numpy中判断一维ndarray是否存在于二维ndarray中
在Numpy中判断一维ndarray是否存在于二维ndarray中
问题原因
Numpy的in操作符(对应np.ndarray.__contains__方法)逻辑和Python列表完全不同:它会检查目标数组的任意元素是否存在于原二维数组中,而非判断整个一维数组是否作为二维数组的一行存在。这就是你得到True True True False的原因:
b的元素1、3都在a中,且刚好是一行,返回Truec的元素1、2都在a中,返回Trued的元素1在a中,返回Truee的元素5不在a中,返回False
而Python列表的in是检查整个子列表是否作为独立元素存在,因此得到True False False False的预期结果。
高效实现方案
方案1:针对与二维数组行长度一致的一维数组
利用Numpy向量化操作,效率最高,适合绝大多数场景:
import numpy as np a = np.array([[1,3],[2,4]]) b = np.array([1,3]) c = np.array([1,2]) d = np.array([1,5]) e = np.array([5]) def is_array_in_2d(arr, arr_2d): # 长度不匹配直接返回False if arr.shape[0] != arr_2d.shape[1]: return False # 逐行匹配,判断是否存在完全一致的行 return (arr_2d == arr).all(axis=1).any() print(is_array_in_2d(b, a)) # True print(is_array_in_2d(c, a)) # False print(is_array_in_2d(d, a)) # False print(is_array_in_2d(e, a)) # False
方案2:支持任意长度的一维数组
如果需要检查不同长度的一维数组(比如示例中的e),可以结合形状检查与逐行匹配:
def is_array_in_2d_general(arr, arr_2d): arr_len = arr.shape[0] for row in arr_2d: if row.shape[0] == arr_len and (row == arr).all(): return True return False print(is_array_in_2d_general(b, a)) # True print(is_array_in_2d_general(c, a)) # False print(is_array_in_2d_general(d, a)) # False print(is_array_in_2d_general(e, a)) # False
注意:该方案包含循环,二维数组规模较大时效率会低于方案1。
方案3:批量检查多个一维数组
如果需要一次性检查多个一维数组,用广播机制优化批量操作:
def batch_check_arrays_in_2d(arr_list, arr_2d): row_len = arr_2d.shape[1] results = [] for arr in arr_list: if arr.shape[0] != row_len: results.append(False) else: results.append((arr_2d == arr).all(axis=1).any()) return results arr_list = [b, c, d, e] print(batch_check_arrays_in_2d(arr_list, a)) # [True, False, False, False]
内容的提问来源于stack exchange,提问作者XiaoBanni
相关产品推荐
相关产品推荐

