Como alguém pode determinar com segurança se um objeto tem um tipo entorpecido?
Percebo que essa pergunta vai contra a filosofia da digitação duck, mas a ideia é garantir que uma função (que usa scipy e numpy) nunca retorne um tipo numpy, a menos que seja chamada com um tipo numpy. Isso surge na solução de outra questão, mas acho que o problema geral de determinar se um objeto tem um tipo numpy está longe o suficiente da questão original para que eles sejam separados.
python
numpy
duck-typing
dynamic-typing
Douglas B. Staple
fonte
fonte
Respostas:
Use a
type
função integrada para obter o tipo e, em seguida, você pode usar a__module__
propriedade para descobrir onde foi definido:fonte
A solução que encontrei é:
No entanto, não está 100% claro que todos os tipos numpy têm a garantia de ser
np.ndarray
ounp.generic
, e essa provavelmente não é uma versão robusta.fonte
dir(numpy)
por tipos e funções embutidas (e classes, mas não acho que tenha) e usar isso para gerar uma tuplaisinstance
contra, o que seria robusto. (Eu acredito que você pode passar funções embutidas para isinstance sejam eles realmente construtores de tipo ou não, mas você teria que verificar isso.)Pergunta antiga, mas encontrei uma resposta definitiva com um exemplo. Não custa nada manter as perguntas atualizadas, pois tive o mesmo problema e não encontrei uma resposta clara. A chave é certificar-se de que você
numpy
importou e, em seguida, execute oisinstance
bool. Embora possa parecer simples, se você estiver fazendo alguns cálculos em diferentes tipos de dados, essa pequena verificação pode servir como um teste rápido antes de iniciar alguma operação vetorial entorpecida.fonte
Na verdade, isso depende do que você está procurando.
ndarray
,isinstance(..., np.ndarray)
provavelmente a é o mais fácil. Certifique-se de não recarregar o numpy em segundo plano, pois o módulo pode ser diferente, mas caso contrário, você deve estar bem.MaskedArrays
,matrix
,recarray
São todas as subclasses dendarray
, assim que você deve ser definido.shape
e umdtype
atributo. Você pode comparádtype
-los aos dtypes básicos, cuja lista você pode encontrar emnp.core.numerictypes.genericTypeRank
. Observe que os elementos desta lista são strings, então você terá que fazer umtested.dtype is np.dtype(an_element_of_the_list)
...fonte
numpy
tipo" e pode definir o que é esse algo, isso é melhor do que as outras respostas. E na maioria dos casos, você deve procurar algo específico que possa definir.Para obter o tipo, use a
type
função embutida. Com oin
operador, você pode testar se o tipo é um tipo numpy, verificando se ele contém a stringnumpy
;(Este exemplo foi executado em IPython , a propósito. Muito útil para uso interativo e testes rápidos.)
fonte
Observe que o
type(numpy.ndarray)
é otype
próprio e esteja atento aos tipos booleanos e escalares. Não desanime se não for intuitivo ou fácil, é uma dor no início.Veja também: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.dtypes.html - https://github.com/machinalis/mypy-data/tree/master/numpy- mypy
Diversão com booleanos:
Mais diversão com tipos escalares, consulte: - https://docs.scipy.org/doc/numpy-1.15.1/reference/arrays.scalars.html#arrays-scalars-built-in
fonte