如何在NumPy中直接比较形状为(n,2)的嵌套数组的子数组匹配情况?
问题:检查NumPy数组中是否存在匹配的双元素子数组
我正在处理形状为(n,2)的任意n值NumPy数组,想要检查其中是否存在完全匹配的双元素子数组。示例代码如下:
import numpy as np a=np.array([[1,0],[2,0]]) b=np.array([[1,0],[2,0]]) c=np.array([[3,0],[4,0]]) d=np.array([[1,0],[5,0]]) if (b == a).any() == True: print('y') if (c == a).any() == True: print('y1') if (d == a).any() == True: print('y2')
当前代码因逐元素比较导致所有条件均为True,但我期望第一个和第三个条件返回True。请问是否存在无需循环即可直接比较的简便方法?
解决方案
要实现检查两个(n,2)数组中是否存在完全匹配的双元素子数组,可以结合NumPy的all()和any()方法,利用广播特性完成无循环的批量比较:
核心思路
- 先对两个数组进行逐元素相等比较,得到形状相同的布尔数组;
- 沿着子数组的维度(
axis=1)调用all(),判断每个子数组的所有元素是否完全匹配,生成一维布尔数组; - 最后调用
any()判断是否存在至少一个完全匹配的子数组。
修正后的代码
import numpy as np a = np.array([[1,0],[2,0]]) b = np.array([[1,0],[2,0]]) c = np.array([[3,0],[4,0]]) d = np.array([[1,0],[5,0]]) # 检查是否存在至少一个完全匹配的子数组 if ((b == a).all(axis=1)).any(): print('y') # 触发,b与a的所有子数组都匹配 if ((c == a).all(axis=1)).any(): print('y1') # 不触发,c与a无匹配子数组 if ((d == a).all(axis=1)).any(): print('y2') # 触发,d与a有一个匹配子数组[1,0]
额外说明
如果需要判断两个数组整体完全相同(所有子数组一一对应匹配),可以直接使用np.array_equal()方法:
print(np.array_equal(a, b)) # 返回True print(np.array_equal(a, d)) # 返回False
内容的提问来源于stack exchange,提问作者jore1
相关产品推荐
相关产品推荐

