如何检测类数组或标量对象的dtype是否为float类型
问题描述
我需要实现逻辑:判断输入是否为float标量,或者由任意浮点类型组成的类数组对象(支持所有可转换为numpy数组的可迭代对象、0维数组),目前的实现会触发弃用警告,需要兼容所有场景的无警告实现。
现有报错实现
def cheese(array_like, *args, **kwargs): if np.array(array_like, copy=False).dtype == np.floating: return "macaroni"
触发的弃用警告如下:
DeprecationWarning: Converting
np.inexactornp.floatingto a dtype is deprecated. The current result isfloat64which is not strictly correct.
if np.array(array_like, copy=False).dtype == np.floating:
解决方案
错误原因
原有代码触发警告的核心原因是np.floating是numpy所有浮点类型的抽象父类,不是具体的dtype实例,直接和dtype对象判等时numpy会尝试将np.floating转换为具体dtype,这个逻辑已经被弃用。
方案1:使用np.issubdtype(官方推荐,兼容性最强)
np.issubdtype是numpy官方提供的dtype继承关系判断接口,可以正确识别所有浮点类型,不会触发弃用警告:
import numpy as np def cheese(array_like, *args, **kwargs): arr = np.array(array_like, copy=False) if np.issubdtype(arr.dtype, np.floating): return "macaroni"
该实现覆盖所有需求场景:
- Python原生float标量:转换后dtype为float64,判断为真
- numpy各类浮点标量(np.float16/np.float32/np.float64等):均判断为真
- 元素全为浮点类型的列表、元组、numpy数组:均判断为真
- 非浮点类型(int、str、bool等标量或数组):判断为假
方案2:使用dtype的kind属性
所有浮点类型的dtype的kind属性固定为'f',也可以快速实现需求:
import numpy as np def cheese(array_like, *args, **kwargs): if np.array(array_like, copy=False).dtype.kind == 'f': return "macaroni"
内容的提问来源于stack exchange,提问作者user9413641
相关产品推荐
相关产品推荐

