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


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

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

5 59

5 ответов:

используйте встроенный 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

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

isinstance(y, (np.ndarray, np.generic) )
, это не 100% ясно что все типы numpy гарантированно будут либо np.ndarray или np.generic, и это, вероятно, не является надежной версией.

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

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

import numpy as np

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

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

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

isinstance(arr,np.ndarray)

чтобы получить тип, используйте встроенный

что на самом деле зависит от того, что вы ищете.

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