You need to enable JavaScript to run this app. 如何检测numpy数组各维度元素数量一致且不受None值影响
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 07:15:04