
本文探讨了如何在numpy 3d数组中高效检测一个子数组是否存在于另一个可能更短且包含重复项的3d数组中,并返回布尔结果。文章提供了两种主要方法:通过字符串转换结合`np.in1d`进行一维比较,以及利用numpy的广播机制进行直接的元素级比较,并详细解释了它们的实现原理、适用场景及潜在的性能考量。
在数据处理和科学计算中,我们经常需要比较大型多维数组中的元素。一个常见的场景是,给定一个包含多个三维向量(或称为2D子数组)的3D NumPy数组source,我们需要判断其中每个向量是否存在于另一个可能更短且包含重复向量的3D数组values中。例如,我们有以下两个数组:
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数组在Axis1上的长度相同,表示source中每个2D子数组是否在values中出现。对于上述示例,期望的输出是[False, False, True, True, False, False, True]。
直接使用np.isin(source, values).all(axis=2)通常无法达到预期效果,因为它会在元素层面进行比较,而不是在完整的2D子数组层面。np.in1d虽然适用于一维数组,但直接应用于3D数组时需要巧妙的转换。
这种方法的核心思想是将每个2D子数组(例如[0,0,0])转换为一个唯一的字符串表示,从而将3D数组的比较问题转化为一维字符串数组的比较问题,进而可以利用np.in1d的强大功能。
result_string_conversion = np.in1d(np.apply_along_axis(''.join, 2, source.astype(str)),
np.apply_along_axis(''.join, 2, values.astype(str)))
print(result_string_conversion)
# 输出: [False False True True False False True]实现原理详解:
注意事项:
第二种方法利用NumPy的广播机制进行直接的元素级比较,然后通过聚合操作来判断子数组的匹配情况。这种方法在某些情况下可能更直接,但需要对NumPy的广播规则有较好的理解。
# 确保source和values的维度兼容,如果source是(1, N, M)而values是(1, K, M), # 需要调整为 (N, M) 和 (K, M) 进行比较,或者在比较前进行适当的维度扩展。 # 考虑到示例数据,source[0] 和 values[0] 才是实际要比较的二维数组 # source_2d = source[0] # 形状 (7, 3) # values_2d = values[0] # 形状 (5, 3) # 原始答案中的方法假设了source和values的维度结构,我们将其适配到 (N, M) 和 (K, M) 的比较 # 为了保持与原始答案一致,我们使用其提供的代码,它隐式处理了第一维 result_broadcast_comparison = (source.transpose(1,0,2) == values).all(2).any(1) print(result_broadcast_conversion) # 输出: [False False True True False False True]
实现原理详解:
为了更好地理解,我们先假设我们要比较的是source[0](形状 (7, 3))和 values[0](形状 (5, 3))。
注意事项:
在NumPy中检测3D数组中子数组的存在性,尤其是在存在重复项的情况下,需要巧妙地运用NumPy的特性。
选择哪种方法取决于您的具体需求:如果内存是关键限制,或者子数组元素类型复杂,字符串转换可能是更好的选择。如果计算性能至关重要且内存允许,广播方法可能提供更快的执行速度。理解这两种方法的内在机制,有助于在实际应用中做出明智的决策。
以上就是Numpy 3D数组中子数组存在性高效检测与重复项处理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号