isinstance() 和 np.issubdtype() 有什么区别?



我有一个数据帧 df:

>>> df = pd.DataFrame({'values':[1.23, 3.12, 23.12]}, dtype=float)

运行检查:

>>> df.values.dtype
dtype('float64')

现在使用 isinstance 方法:

>>> isinstance(df.values.dtype, float)
False

现在使用 issubdtype 方法:

>>> np.issubdtype(df.values.dtype, float)
True

通过阅读文档。

语法是实例(对象,类信息(

对象:对象实例。

我正在传递一个 ndarray 对象(我可以将其视为对象实例吗?

classinfo:包含类、类型或其他元组的类、类型或元组。

我正在传递浮点数,这是一种类型,这很好。

问题是:为什么在上面的例子中,isinstance没有返回true?isinstance和issubdtype有什么区别?

为什么在上面的例子中isinstance没有返回true?

因为df.values.dtype返回一个类型,而不是该类型的对象。事实上,df.values.dtype返回dtype('float')但这不是一个float对象。它是一个dtype对象。

issubdtype采用dtype、type 或字符串,并检查第一种类型是相同的还是第二种类型的子类。我们可以检查该类型的方法解析顺序,并看到:

>>> df.values.dtype.type.__mro__
(<class 'numpy.float64'>, <class 'numpy.floating'>, <class 'numpy.inexact'>, <class 'numpy.number'>, <class 'numpy.generic'>,<class 'float'>, <class 'object'>)

所以类型确实是float的一个子类。但它不是float的实例。例如float的实例是0.03.14np.nan等。如果我们检查这些对象的类型,我们会得到:

>>> type(0.0)
<class 'float'>
>>> type(3.14)
<class 'float'>
>>> type(np.nan)
<class 'float'>

而 对于dtype('float')的类型是dtype,而对于float的类型,它只是type

>>> type(df.values.dtype)
<class 'numpy.dtype'>
>>> type(float)
<class 'type'>

因此,我们可以检查df.values.dtype是否是dtype的实例,并获得:

>>> isinstance(df.values.dtype, np.dtype)
True

首先,df.values.dtype是 numpy 类 dtype 的一个实例,而不是 Python 类float的实例:

>>> df.values.dtype
dtype('float64')
>>> isinstance(df.values.dtype, np.dtype)
True
>>> isinstance(df.values.dtype, float)
False

其次,从函数的源代码np.issubdtype我们看到,当调用np.issubdtype(df.values.dtype, float)时,第一个参数df.values.dtype被转换为df.values.dtype.type(即np.float64(和第二个参数floatnp.floating。那么返回的是issubclass(np.float64, np.floating),这当然是True

所以,简而言之,df.values.dtypenp.floating子类,而不是float的实例。

最新更新