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

如何在Numpy中判断一维ndarray是否存在于二维ndarray中

在Numpy中判断一维ndarray是否存在于二维ndarray中

问题原因

Numpy的in操作符(对应np.ndarray.__contains__方法)逻辑和Python列表完全不同:它会检查目标数组的任意元素是否存在于原二维数组中,而非判断整个一维数组是否作为二维数组的一行存在。这就是你得到True True True False的原因:

  • b的元素1、3都在a中,且刚好是一行,返回True
  • c的元素1、2都在a中,返回True
  • d的元素1在a中,返回True
  • e的元素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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:30:58