如何判断3D Numpy数组的子数组是否存在于含重复的短3D数组
解决3D Numpy数组子数组匹配问题
问题分析
你需要判断source数组中的每个3元素子数组是否存在于values数组的子数组中,而非检查单个元素是否在values中。之前使用np.isin(source, values).all(axis=2)得到全True,是因为该方法仅验证子数组的每个元素是否存在于values的任意元素中,而非整个子数组的完整匹配。
解决方案
方法1:结合数组视图转换使用np.in1d
将3元素子数组转换为可哈希的单元素类型,再用np.in1d实现匹配:
import numpy as np source = np.array([[[0,0,0],[0,0,1],[0,1,0],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]]) values = np.array([[[0,1,0],[1,0,0],[1,1,1],[1,1,1],[0,1,0]]]) # 重塑为2D数组,统一处理每个子数组 source_2d = source.reshape(-1, 3) values_2d = values.reshape(-1, 3) # 将每个3元素子数组转为uint32类型的单个元素(适用于元素为0-1的场景) source_view = source_2d.view(np.uint32).ravel() values_view = values_2d.view(np.uint32).ravel() # 对values去重,避免重复判断 unique_values = np.unique(values_view) # 生成最终匹配结果 result = np.in1d(source_view, unique_values) print(result) # 输出: [False False True True False False True]
方法2:利用广播实现全子数组匹配
通过扩展维度广播,直接比较每个子数组的完整匹配情况:
import numpy as np source = np.array([[[0,0,0],[0,0,1],[0,1,0],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]]) values = np.array([[[0,1,0],[1,0,0],[1,1,1],[1,1,1],[0,1,0]]]) source_2d = source.reshape(-1, 3) values_2d = values.reshape(-1, 3) # 广播比较:每个source子数组与所有values子数组逐一匹配,取任意匹配结果 matches = (source_2d[:, None] == values_2d).all(axis=2).any(axis=1) print(matches) # 输出: [False False True True False False True]
方法说明
- 方法1适合数据量较大的场景,转换为单元素后匹配效率更高;
- 方法2逻辑更直观,无需类型转换,便于理解和调试。
内容的提问来源于stack exchange,提问作者Raphadasilva
相关产品推荐
相关产品推荐

