Как определить типы 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)
что на самом деле зависит от того, что вы ищете.
- если вы хотите проверить, является ли последовательность на самом деле
ndarray
, aisinstance(..., 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)
...