Как можно надежно определить, имеет ли объект тип numpy?
Я понимаю, что этот вопрос идет вразрез с философией утиной печати, но идея состоит в том, чтобы убедиться, что функция (которая использует scipy и numpy) никогда не возвращает тип numpy, если она не вызывается с типом numpy. Это возникает в решении другого вопроса, но я думаю, что общая проблема определения того, имеет ли объект тип numpy, достаточно далека от этого исходного вопроса, чтобы их следует разделять.
python
numpy
duck-typing
dynamic-typing
Дуглас Б. Стейпл
источник
источник
Ответы:
Используйте встроенную
type
функцию, чтобы получить тип, затем вы можете использовать__module__
свойство, чтобы узнать, где он был определен:источник
Решение, которое я придумал:
Однако не на 100% ясно, что все типы numpy гарантированно будут либо
np.ndarray
илиnp.generic
, и это, вероятно, не является устойчивым к версии.источник
dir(numpy)
типы и встроенные функции (и классы, но я не думаю, что они есть) и использовать это для создания кортежа дляisinstance
против, что было бы надежным. (Я считаю, что вы можете передавать встроенные функции в isinstance, независимо от того, являются ли они конструкторами типов или нет, но вам нужно это проверить.)Старый вопрос, но я пришел к окончательному ответу на примере. Не помешает держать вопросы свежими, так как у меня была такая же проблема, и я не нашел четкого ответа. Ключ в том, чтобы убедиться, что вы
numpy
импортировали, а затем запустить командуisinstance
bool. Хотя это может показаться простым, если вы выполняете какие-то вычисления с разными типами данных, эта небольшая проверка может послужить быстрой проверкой перед тем, как вы начнете некоторую векторизованную операцию.источник
На самом деле это зависит от того, что вы ищете.
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)
...источник
numpy
типом» и можете определить, что это за что-то, это лучше, чем другие ответы. И в большинстве случаев вам следует искать что-то конкретное, что вы можете определить.Чтобы получить тип, используйте встроенную
type
функцию. С помощьюin
оператора вы можете проверить, является ли тип типом numpy, проверив, содержит ли он строкуnumpy
;(Этот пример , кстати, был запущен в IPython . Очень удобен для интерактивного использования и быстрых тестов.)
источник
Обратите внимание, что
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
Развлечение с логическими значениями:
Больше удовольствия от скалярных типов см .: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
источник