Подтвердить что ты не робот

Как определить типы numpy в python?

Как можно надежно определить, имеет ли объект тип numpy?

Я понимаю, что этот вопрос идет вразрез с философией печати уток, но идея состоит в том, чтобы убедиться, что функция (которая использует scipy и numpy) никогда не возвращает тип numpy, если она не вызвана с типом numpy. Это возникает в решении другого вопроса, но я думаю, что общая проблема определения того, имеет ли объект тип numpy, достаточно далеко от этого исходного вопроса, который они должны разделяться.

4b9b3361

Ответ 1

Используйте встроенную функцию type, чтобы получить тип, затем вы можете использовать свойство __module__, чтобы узнать, где он был определен:

>>> import numpy as np
a = np.array([1, 2, 3])
>>> type(a)
<type 'numpy.ndarray'>
>>> type(a).__module__
'numpy'
>>> type(a).__module__ == np.__name__
True

Ответ 2

Решение, которое я придумал, это:

isinstance(y, (np.ndarray, np.generic) )

Тем не менее, не 100% ясно, что все типы numpy гарантированы как np.ndarray или np.generic, и это, вероятно, isn 't версия надежная.

Ответ 3

Старый вопрос, но я придумал окончательный ответ с примером. Не помешает держать вопросы свежими, поскольку у меня была такая же проблема, и я не нашел четкого ответа. Ключ должен убедиться, что вы импортировали numpy, а затем запустите isinstance bool. Хотя это может показаться простым, если вы выполняете некоторые вычисления по разным типам данных, эта небольшая проверка может служить быстрым тестом перед началом какой-либо операции с нулевым вектором.

##################
# important part!
##################

import numpy as np

####################
# toy array for demo
####################

arr = np.asarray(range(1,100,2))

########################
# The instance check
######################## 

isinstance(arr,np.ndarray)

Ответ 4

Чтобы получить тип, используйте встроенную функцию type. С помощью оператора in вы можете проверить, является ли тип типом numpy, проверяя, содержит ли он строку numpy;

In [1]: import numpy as np

In [2]: a = np.array([1, 2, 3])

In [3]: type(a)
Out[3]: <type 'numpy.ndarray'>

In [4]: 'numpy' in str(type(a))
Out[4]: True

(Этот пример был запущен в IPython, очень удобный для интерактивного использования и быстрых тестов.)

Ответ 5

Это зависит от того, что вы ищете.

  • Если вы хотите проверить, действительно ли последовательность ndarray, то isinstance(..., np.ndarray), вероятно, самая простая. Убедитесь, что вы не перезагружаете numpy в фоновом режиме, поскольку модуль может быть другим, но в остальном вы должны быть в порядке. MaskedArrays, matrix, recarray - все подклассы ndarray, поэтому вы должны быть установлены.
  • Если вы хотите проверить, является ли скаляр числовым скаляром, все становится немного сложнее. Вы можете проверить, имеет ли он атрибут shape и dtype. Вы можете сравнить его dtype с базовыми dtypes, список которых вы можете найти в np.core.numerictypes.genericTypeRank. Обратите внимание, что элементы этого списка являются строками, поэтому вам нужно будет сделать tested.dtype is np.dtype(an_element_of_the_list)...

Ответ 6

Обратите внимание, что type(numpy.ndarray) является самим type и следите за булевыми и скалярными типами. Не расстраивайтесь, если это не интуитивно или просто, это поначалу боль.

Смотрите также: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy

>>> import numpy as np
>>> np.ndarray
<class 'numpy.ndarray'>
>>> type(np.ndarray)
<class 'type'>
>>> a = np.linspace(1,25)
>>> type(a)
<class 'numpy.ndarray'>
>>> type(a) == type(np.ndarray)
False
>>> type(a) == np.ndarray
True
>>> isinstance(a, np.ndarray)
True

Веселье с логическими значениями:

>>> b = a.astype('int32') == 11
>>> b[0]
False
>>> isinstance(b[0], bool)
False
>>> isinstance(b[0], np.bool)
False
>>> isinstance(b[0], np.bool_)
True
>>> isinstance(b[0], np.bool8)
True
>>> b[0].dtype == np.bool
True
>>> b[0].dtype == bool  # python equivalent
True

Больше развлечений со скалярными типами смотрите: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in

>>> x = np.array([1,], dtype=np.uint64)
>>> x[0].dtype
dtype('uint64')
>>> isinstance(x[0], np.uint64)
True
>>> isinstance(x[0], np.integer)
True  # generic integer
>>> isinstance(x[0], int)
False  # but not a python int in this case

# Try matching the 'kind' strings, e.g.
>>> np.dtype('bool').kind                                                                                           
'b'
>>> np.dtype('int64').kind                                                                                          
'i'
>>> np.dtype('float').kind                                                                                          
'f'
>>> np.dtype('half').kind                                                                                           
'f'

# But be weary of matching dtypes
>>> np.integer
<class 'numpy.integer'>
>>> np.dtype(np.integer)
dtype('int64')
>>> x[0].dtype == np.dtype(np.integer)
False

# Down these paths there be dragons:

# the .dtype attribute returns a kind of dtype, not a specific dtype
>>> isinstance(x[0].dtype, np.dtype)
True
>>> isinstance(x[0].dtype, np.uint64)
False  
>>> isinstance(x[0].dtype, np.dtype(np.uint64))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: isinstance() arg 2 must be a type or tuple of types
# yea, don't go there
>>> isinstance(x[0].dtype, np.int_)
False  # again, confusing the .dtype with a specific dtype


# Inequalities can be tricky, although they might
# work sometimes, try to avoid these idioms:

>>> x[0].dtype <= np.dtype(np.uint64)
True
>>> x[0].dtype <= np.dtype(np.float)
True
>>> x[0].dtype <= np.dtype(np.half)
False  # just when things were going well
>>> x[0].dtype <= np.dtype(np.float16)
False  # oh boy
>>> x[0].dtype == np.int
False  # ya, no luck here either
>>> x[0].dtype == np.int_
False  # or here
>>> x[0].dtype == np.uint64
True  # have to end on a good note!