You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python/NumPy类型标注问题:如何正确声明sensor_data_to_numpy返回值类型

NumPy 异构数组返回值类型标注方案

你遇到的问题本质是NumPy异构数组的类型标注,普通同类型数组的标注语法不适用,下面是两种可行方案:

方案1:严谨结构化数组标注(推荐)

你返回的数组包含固定结构的字段,用NumPy结构化数组可以实现字段级的类型校验:

  1. 首先导入依赖类型:
import numpy as np
import numpy.typing as npt
from typing import Union, List
# 此处省略你已定义的SensorData类
  1. 定义对应结构的dtype并标注返回值:
# 假设SensorData的matrix字段是固定长度N的浮点序列,按需替换下方的N为实际长度
SensorArrayDType = np.dtype([
    ("label", np.str_),
    ("sample", np.str_),
    ("file", np.str_),
    ("matrix", np.float64, (N,))
])

def sensor_data_to_numpy(data: Union[SensorData, List[SensorData]]) -> npt.NDArray[SensorArrayDType]:
    if isinstance(data, list):
        res = np.empty(len(data), dtype=SensorArrayDType)
        res["label"] = [item.label for item in data]
        res["sample"] = [item.sample for item in data]
        res["file"] = [item.file for item in data]
        res["matrix"] = [item.matrix for item in data]
        return res
    else:
        res = np.empty(1, dtype=SensorArrayDType)
        res["label"][0] = data.label
        res["sample"][0] = data.sample
        res["file"][0] = data.file
        res["matrix"][0] = data.matrix
        return res

如果matrix长度不固定,将dtype中matrix的定义改为("matrix", object)即可,标注逻辑不变。

方案2:快速object类型标注

如果你不想修改原有函数的实现逻辑(直接摊平所有元素生成数组),此时NumPy会自动将数组转为object类型,直接标注即可:

def sensor_data_to_numpy(data: Union[SensorData, List[SensorData]]) -> npt.NDArray[np.object_]:
    if isinstance(data, List):
        return np.array([[item.label, item.sample, item.file, *item.matrix] for item in data])
    else:
        return np.array([data.label, data.sample, data.file, *data.matrix])

该方案仅能标注数组的基础类型,无法校验内部元素的结构和具体类型,适合不需要严格类型校验的场景。

内容的提问来源于stack exchange,提问作者Mike Mitterer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:54:08