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

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:43:26