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

查找包含另一数组行元素的NumPy数组行索引

问题描述

现有两个NumPy数组np1和np2,维度分别为(n1,4)和(n2,3),满足n1>n2,且np1的每一行都包含np2对应行的全部元素。需求是为np2的每一行找到np1中包含该行所有元素的行索引,输出维度为(n2×1)的数组。允许np1的同一行对应np2的多行,但np2的每一行仅对应np1的唯一一行。要求处理大数据量时保持高效,用户尝试过np.isin和np.sort但在获取原始索引时遇到复杂度问题。

示例1

A = [[1,2,4,3],[10,20,30,40],[100,200,28,16],[200,4,20,39]]
B = [[10,30,20],[200,28,16],[1,2,3]]

预期结果:[1,2,0]

示例2

A = [[1,2,4,3],[10,20,30,40],[100,200,28,16],[200,4,20,39]]
B = [[10,30,20],[200,28,16],[20,30,40],[1,2,3]]

预期结果:[1,2,1,0]

高效解决方案

方法一:NumPy向量化实现

核心思路是通过排序统一元素顺序,再利用广播和向量化操作快速匹配子集关系,避免Python循环的高开销。

代码

import numpy as np

def find_matching_indices(np1, np2):
    # 对每行排序,统一元素顺序
    sorted_np1 = np.sort(np1, axis=1)
    sorted_np2 = np.sort(np2, axis=1)
    
    # 广播生成匹配掩码:检查np2每行是否被np1某行包含
    mask = np.isin(sorted_np2[:, None, :], sorted_np1[:, :]).all(axis=2)
    
    # 获取每个np2行对应的第一个匹配索引
    indices = np.argmax(mask, axis=1)
    
    return indices.reshape(-1, 1)

# 测试示例1
A = np.array([[1,2,4,3],[10,20,30,40],[100,200,28,16],[200,4,20,39]])
B = np.array([[10,30,20],[200,28,16],[1,2,3]])
print(find_matching_indices(A, B))  # 输出 [[1],[2],[0]]

# 测试示例2
B2 = np.array([[10,30,20],[200,28,16],[20,30,40],[1,2,3]])
print(find_matching_indices(A, B2))  # 输出 [[1],[2],[1],[0]]

说明

该方法利用NumPy底层C实现加速,时间复杂度为O(n1n23),比逐行循环效率提升显著,适合中等规模的大数据处理。

方法二:Pandas哈希映射实现

针对超大规模数据,通过哈希映射将匹配操作降为O(1)级,进一步提升效率。

代码

import pandas as pd
import numpy as np

def find_matching_indices_pd(np1, np2):
    # 处理np1,构建排序元组到索引的映射
    df1 = pd.DataFrame(np1)
    df1['sorted_tuple'] = df1.apply(lambda row: tuple(sorted(row)), axis=1)
    key_to_idx = {tuple_val: idx for idx, tuple_val in enumerate(df1['sorted_tuple'])}
    
    # 处理np2,查找对应索引
    df2 = pd.DataFrame(np2)
    df2['sorted_tuple'] = df2.apply(lambda row: tuple(sorted(row)), axis=1)
    indices = df2['sorted_tuple'].map(key_to_idx).values
    
    return indices.reshape(-1, 1)

# 测试示例
print(find_matching_indices_pd(A, B))  # 输出 [[1],[2],[0]]

说明

该方法时间复杂度接近O(n1 + n2),哈希查找开销极低,适合百万级以上的大规模数据。如果np1存在多行排序后元组相同的情况,映射字典会保留最后一行的索引,可调整为遍历df1时只记录首次出现的索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:13:14