python: comment déterminer si une variable est un tableau ou un scalaire
J'ai une fonction qui prend l'argument NBins
. Je veux faire un appel à cette fonction par un scalaire 50
ou un tableau [0, 10, 20, 30]
. Comment puis-je identifier à l'intérieur de la fonction, ce que la longueur de NBins
est? ou autrement dit, si c'est un scalaire ou un vecteur?
J'ai essayé ceci:
>>> N=[2,3,5]
>>> P = 5
>>> len(N)
3
>>> len(P)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
>>>
Comme vous le voyez, je ne peux pas len
à P
, puisqu'il n'est pas un tableau.... Est-il quelque chose comme isarray
ou isscalar
en python?
grâce
- Avez-vous essayé de tester pour la
type
?
Vous devez vous connecter pour publier un commentaire.
À l'appui de n'importe quel type de séquence,
collections.Sequence
au lieu delist
.note:
isinstance
prend également en charge un tuple de classes, vérifieztype(x) in (..., ...)
doit être évitée et inutiles.Vous pouvez aussi veux vérifier
not isinstance(x, (str, unicode))
list
à obtenir de faux pour les scalaires... mercicollections.Sequence
ABC est un pour de chaîne, et qui devrait donc être pris en compte. Je suis en utilisant quelque chose commeif type(x) is not str and isinstance(x, collections.Sequence):
. Ce n'est pas grand, mais il est fiable.type
, et également de vérifiernot isinstance(x, (str, unicode))
sur Python 2Réponses précédentes supposent que le tableau est un standard python liste. Que quelqu'un qui utilise numpy souvent, je vous recommande un très pythonic test de:
__len__
attribut (donc, je suppose, n'est pas techniquement un type scalaire)if hasattr(N, '__len__') and (not isinstance(N, str))
serait en compte correctement les chaînes de caractères.if hasattr(N, "__iter__")
devrait également fonctionner.Combinant @jamylak et @jpaddison3 de l'ensemble des réponses, si vous avez besoin d'être robuste contre les tableaux numpy que l'entrée et à les gérer de la même manière que pour les listes, vous devez utiliser
C'est robuste contre les sous-classes de la liste, tuple et des tableaux numpy.
Et si vous voulez être robuste à l'encontre de tous les autres sous-classes de la séquence ainsi (et pas seulement de la liste et de tuple), l'utilisation
Pourquoi devriez-vous faire les choses de cette façon avec
isinstance
et de ne pas comparertype(P)
avec une valeur cible? Voici un exemple, où nous faisons et étudier le comportement deNewList
, un trivial sous-classe de la liste.Malgré
x
ety
la comparaison que l'égalité, de la manipulation partype
entraînerait des comportements différents. Cependant, depuisx
est une instance d'une sous-classe delist
, à l'aide deisinstance(x,list)
donne le comportement désiré et traitex
ety
de la même manière.Est-il équivalent à isscalar() dans numpy? Oui.
>>> np.isscalar('abcd')
retourneTrue
.return (isinstance(num, generic) or type(num) in ScalarType or isinstance(num, numbers.Number))
numpy.isscalar()
fonction souffre d'un certain nombre de inconciliables des défauts de conception et probablement obsolète à l'avenir de révision. Pour paraphraser documentation officielle: "Dans presque tous les casnp.ndim(x) == 0
doit être utilisé au lieu denp.isscaler(x)
, comme l'ancien testament aussi bien retourner true pour 0d tableaux." Un robuste compatible de remplacement pournumpy.isscalar()
serait donc à trivialement enveloppernumpy.ndim()
: par exemple,def is_scalar(obj): return np.ndim(obj) == 0
np.isscalar
est source de confusion. Officiel doc a suggéré d'utilisernp.array.ndim
partout, c'est à direnp.isscalar(np.array(12))
est False, alors qu'il devrait être considéré comme scalaire depuisnp.array(12).ndim
est de 0.Tout, @jamylak de l'approche est la meilleure, ici est une approche alternative
type(p) in (list, )
.Une autre approche alternative (utilisation de la classe nom la propriété):
Pas besoin d'importer quoi que ce soit.
Simplement utiliser
size
au lieu delen
!np.size(5)
etnp.size([5])
sont à la fois ==1
, donc ce n'est pas correctement la distinction entre type (c'est à dire, d'identifier un scalaire), je crois que c'est le but.Vous pouvez vérifier le type de données de la variable.
Il donnera à vous de mettre comme type de données de P.
De sorte que vous pouvez distinguer que c'est un entier ou un tableau.
Je suis surpris que cette question de base ne semble pas avoir une réponse immédiate en python.
Il me semble que presque toutes les réponses proposées utiliser une méthode de type
la vérification, qui est généralement déconseillé en python et ils semblent limités à un cas particulier (ils échouent avec différents types numériques ou générique iteratable objets qui ne sont pas des n-uplets ou des listes).
Pour moi, ce qui fonctionne le mieux, c'est de l'importation de numpy et à l'aide du tableau.taille, par exemple:
Noter également:
mais:
Ici est la meilleure approche que j'ai trouvé: Vérifier l'existence de
__len__
et__getitem__
.Vous demandez peut-être pourquoi? Les raisons comprend:
isinstance(obj, abc.Sequence)
échoue sur certains objets, y compris PyTorch du Tenseur parce qu'ils ne mettent pas en œuvre__contains__
.__len__
et__getitem__
.Alors sans plus tarder:
Notez que j'ai ajouté les paramètres par défaut parce que la plupart du temps, vous pourriez envisager de chaînes de valeurs, pas de tableaux. De même pour les n-uplets.
preds_test[0] est de la forme (128,128,1)
Permet de vérifier son type de données à l'aide de isinstance() la fonction
isinstance prend 2 arguments.
1er argument est de données
2ème argument est de type de données
isinstance(preds_test[0], np.ndarray) donne de Sortie comme Vrai. Cela signifie preds_test[0] est un tableau.