如何用Numpy判断二维数组每行元素是否全部相同(含0)
判断二维Numpy数组每行元素是否全部相同(含0)
需求是判断二维Numpy数组的每行元素是否全部相同,0属于合法取值。示例如下:
>>> a = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]) >>> a array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]) >>> function_to_find(a) True
尝试过用all()和any()组合,但不符合需求:
>>> a = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]) >>> a.all() False >>> a.all(axis=1) array([False, True, True, True]) >>> a.all(axis=1).any() True
比如当数组为[[0,0,0],[1,1,1],[2,2,2],[3,3,5]]时,上述方法仍返回True,但实际需要得到False。
已有基于循环的实现,但希望改用纯Numpy方法:
results_bool = np.array([]) for i in a: results_bool = np.append(results_bool, np.all(i == i[0])) result = np.all(results_bool)
纯Numpy解决方案
方法一:广播逐元素比较
利用Numpy的广播机制,直接对比每行所有元素与该行第一个元素是否一致:
import numpy as np def check_all_rows_same(a): return np.all(a == a[:, [0]], axis=1).all()
a[:, [0]]提取每行第一个元素,生成形状为(n,1)的数组,与原数组(n,m)广播后逐元素比较;np.all(..., axis=1)对每行的比较结果取逻辑与,得到标记每行是否全同的布尔数组;- 最后用
np.all()判断所有行是否都满足条件。
测试验证:
# 全部行元素相同 a1 = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]]) print(check_all_rows_same(a1)) # 输出: True # 存在行元素不同 a2 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,5]]) print(check_all_rows_same(a2)) # 输出: False
方法二:对比每行最大最小值
如果每行的最大值和最小值相等,说明该行所有元素一致:
def check_all_rows_same(a): return np.all(np.max(a, axis=1) == np.min(a, axis=1))
这个方法逻辑直观,计算效率也不错,适合数值型数组。
内容的提问来源于stack exchange,提问作者cicciodevoto
相关产品推荐
相关产品推荐

