如何检测numpy数组各维度元素数量一致且不受None值影响
最优检测方案
核心逻辑是递归校验数组每个维度下的所有元素的结构一致性,遇到非序列类的标量(包括None、数值、字符串等)时终止校验,不会把包含合法标量的规则数组误判为不规则数组。
常见误判方案说明
现有多数公开方案的问题在于仅通过numpy数组的
dtype == object就判定为不规则数组,忽略了object类型数组也可以存储规则的标量元素(比如None、字符串等),比如会把符合要求的arr2误判为异常。
实现代码
import numpy as np def is_regular_array(arr): # 处理numpy数组类型 if isinstance(arr, np.ndarray): if arr.ndim == 0: return True # 取第一个元素作为基准结构 base = arr[0] base_valid = is_regular_array(base) if not base_valid: return False # 遍历其余元素和基准比对 for elem in arr[1:]: if is_regular_array(elem) != base_valid: return False # 排除字符串/字节类的特殊序列,只校验集合类序列长度 if hasattr(base, '__len__') and not isinstance(base, (str, bytes)): if len(elem) != len(base): return False return True # 处理Python原生列表、元组类型 elif isinstance(arr, (list, tuple)): if not arr: return True base = arr[0] base_valid = is_regular_array(base) if not base_valid: return False for elem in arr[1:]: if is_regular_array(elem) != base_valid: return False if hasattr(base, '__len__') and not isinstance(base, (str, bytes)): if len(elem) != len(base): return False return True # 非序列类标量(包括None、数值、字符串等)直接判定为合法 else: return True
测试用例验证
arr1 = np.array([[0,1],[2,3],[4,5]]) arr2 = np.array([1,2,None,4]) arr3 = np.array([1,2,3,[4,5]]) print(is_regular_array(arr1)) # 输出:True print(is_regular_array(arr2)) # 输出:True print(is_regular_array(arr3)) # 输出:False
方案优势
- 无已知误判场景,完全符合需求的判定规则
- 支持任意维度的数组校验,兼容嵌套Python序列的numpy object类型数组
- 递归逻辑提前终止,遇到不一致结构立刻返回,性能最优
内容的提问来源于stack exchange,提问作者user7864386
相关产品推荐
相关产品推荐

