【问题标题】:What's the difference between isinstance() and np.issubdtype()?isinstance() 和 np.issubdtype() 有什么区别?
【发布时间】:2020-01-12 09:39:09
【问题描述】:

我有一个数据框 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

通过阅读文档。

语法 isinstance (object, classinfo)

object:一个对象实例。

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

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

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

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

【问题讨论】:

  • issubdtype 适用于两种类型(并检查一种类型是否是另一种类型的子类型),而isinstance 适用于 object 和一种类型,并检查如果对象是该类型的实例。
  • 为什么我给出的示例返回 false?
  • 因为dtype('float') 不是浮动对象(浮动对象将是0.0、3.14、np.nan 等)。它是一种类型。
  • @WillemVanOnsem:它甚至不是一种类型。 NumPy 的 dtype 系统是一个独立于普通 Python 类型系统的系统。 dtype('float') 是 dtype,而不是类型。
  • “我正在传递一个 ndarray 对象”——不,你不是。那将是df.values,而不是df.values.dtype。

标签: python pandas numpy


【解决方案1】:

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

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

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

>>> 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.0、3.14、np.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

【讨论】:

  • 您在这里混淆了数据类型和类型。虽然这样做通常不会引起问题,但对于这样的问题,区别更为重要。例如,虽然numpy.issubdtype(df.values.dtype, float) 是True(目前因为float 是特殊情况,并且在将来的某些NumPy 版本中因为float 隐式调用了dtype),issubclass(df.values.dtype, float) 引发TypeError .
【解决方案2】:

首先,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的source code我们看到,在调用np.issubdtype(df.values.dtype, float)时,第一个参数df.values.dtype被转换为df.values.dtype.type(即np.float64),第二个参数float到np.floating。那么返回的是issubclass(np.float64, np.floating),当然是True。

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

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 2010-12-31
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    相关资源
    最近更新 更多