如何查找numpy数组中存在于另一数组中的行的索引
查找NumPy数组中匹配指定行的索引
方法1:集合+元组(直观易懂)
将arrlist的每一行转换为元组存入集合,再遍历rand_arr的行判断是否在集合中,收集对应索引:
import numpy as np arrlist = np.array([[1,0,0,1] , [0,1,1,0]]) rand_arr = np.array([[1,0,0,1],[0,1,1,0],[1,1,1,0]]) # 把目标行转为元组集合 target_rows = set(tuple(row) for row in arrlist) # 遍历收集匹配索引 matching_indices = [i for i, row in enumerate(rand_arr) if tuple(row) in target_rows] # 转为NumPy数组输出 result = np.array(matching_indices) print(result) # 输出:[0 1]
方法2:NumPy广播匹配(纯向量运算)
利用广播特性让两行数组做元素级比较,判断每行是否完全匹配:
# 广播实现逐行全匹配判断:(N,1,4) 与 (M,4) 比较 → (N,M,4),再按维度2取全True matches = (rand_arr[:, np.newaxis, :] == arrlist).all(axis=2) # 提取存在匹配的行索引 matching_indices = np.where(matches.any(axis=1))[0] print(matching_indices) # 输出:[0 1]
方法3:视图转换+np.isin(高效处理大数据)
通过np.view将每行转为单个标量,再用np.isin快速匹配,适合大数量级场景:
# 转换视图:把每行4个int8元素转为一个int32标量(需保证元素类型+长度匹配对应整数类型) arrlist_view = arrlist.view(np.int32).ravel() rand_arr_view = rand_arr.view(np.int32).ravel() # 查找匹配索引 matching_indices = np.where(np.isin(rand_arr_view, arrlist_view))[0] print(matching_indices) # 输出:[0 1]
注:视图转换需确保元素类型与行长度能对应到合法整数类型,比如4个int64元素无法直接转为标准整数类型,需根据实际情况调整。
内容的提问来源于stack exchange,提问作者proton
相关产品推荐
相关产品推荐

