В чем разница между isinstance () и np.issubdtype ()? - PullRequest
2 голосов
/ 12 января 2020

У меня есть фрейм данных 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

При чтении do c.

Синтаксис isinstance (объект, classinfo)

объект : Экземпляр объекта.

Я передаю объект ndarray (Можно ли считать это экземпляром объекта?)

classinfo : класс, тип или кортеж, содержащий классы, типы или другие кортежи.

Я передаю float, который является типом, и это хорошо.

Вопрос: почему isinstance не возвращает истину в приведенном выше примере? и в чем разница между isinstance и issubdtype?

Ответы [ 2 ]

0 голосов
/ 12 января 2020

df.values.dtype является экземпляром класса numpy dtype, а не класса Python float или даже numpy float64:

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

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

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

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

Однако обратите внимание, что df.values.dtype.type является подклассом float:

>>> df.values.dtype.type
numpy.float64

>>> issubclass(df.values.dtype.type, float)
True

В общем, когда мы передаем dtype=float в numpy (или pandas), он автоматически конвертируется до np.float_ (np.float64), np.dtype(float).type.

NumPy знает, что int относится к np.int_, bool означает np.bool_, что float - это np.float_, а complex - это np.complex _.

Сейчас из исходного кода функции np.issubdtype мы видим, что при вызове np.issubdtype(df.values.dtype, float) первый аргумент df.values.dtype преобразуется в df.values.dtype.type (т.е. np.float64), а второй аргумент float до np.floating. Тогда возвращается 1031 True.

0 голосов
/ 12 января 2020

почему isinstance не возвращает true в приведенном выше примере?

Поскольку df.values.dtype возвращает тип , а не объект этого типа. Действительно, df.values.dtype возвращает dtype('float'), но это , а не a float объект . Это объект dtype.

issubdtype принимает тип d, тип или строку и проверяет, является ли первый тип тем же или подклассом второго типа. Мы можем проверить порядок разрешения метода типа и посмотреть:

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

, так что тип действительно является подклассом float. Но это не экземпляр float. Экземпляр float - это, например, 0.0, 3.14, np.nan, et c. Если мы проверим тип этих объектов, то получим:

>>> 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...