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

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

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

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 bool. Хотя это может показаться простым, если вы делаете некоторые вычисления для разных типов данных, эта небольшая проверка может служить быстрым тестом перед началом некоторой векторизованной операции 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)

чтобы получить тип, используйте builtin


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

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