python: как определить, является ли переменная массивом или скалярным

У меня есть функция, которая принимает аргумент NBins . Я хочу сделать вызов этой функции со скаляром 50 или массивом [0, 10, 20, 30] . Как я могу идентифицировать внутри функции, какова длина NBins ? или иначе, если это скаляр или вектор?

Я попробовал это:

 >>> 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() >>> 

Как вы видите, я не могу применить len к P , так как это не массив … Есть ли что-то вроде isarray или isscalar в python?

благодаря

10 Solutions collect form web for “python: как определить, является ли переменная массивом или скалярным”

 >>> isinstance([0, 10, 20, 30], list) True >>> isinstance(50, list) False 

Чтобы поддерживать какой-либо тип последовательности, проверьте collections.Sequence вместо list .

note : isinstance также поддерживает кортеж классов, type(x) in (..., ...) проверки type(x) in (..., ...) следует избегать и не нужно.

Вы также можете проверить not isinstance(x, (str, unicode))

Предыдущие ответы предполагают, что массив является стандартным списком python. Как кто-то, кто часто использует numpy, я бы рекомендовал очень pythonic тест:

 if hasattr(N, "__len__") 

Объединяя ответы @jamylak и @ jpaddison3 вместе, если вам нужно быть надежными против массивов numpy в качестве входных данных и обрабатывать их так же, как списки, вы должны использовать

 import numpy as np isinstance(P, (list, tuple, np.ndarray)) 

Это устойчиво против подклассов массивов list, tuple и numpy.

И если вы хотите быть устойчивым ко всем другим подклассам последовательности (а не только список и кортеж), используйте

 import collections import numpy as np isinstance(P, (collections.Sequence, np.ndarray)) 

Почему вы должны так поступать с isinstance и не сравнивать type(P) с целевым значением? Вот пример, где мы делаем и изучаем поведение NewList , тривиального подкласса списка.

 >>> class NewList(list): ... isThisAList = '???' ... >>> x = NewList([0,1]) >>> y = list([0,1]) >>> print x [0, 1] >>> print y [0, 1] >>> x==y True >>> type(x) <class '__main__.NewList'> >>> type(x) is list False >>> type(y) is list True >>> type(x).__name__ 'NewList' >>> isinstance(x, list) True 

Несмотря на то, что x и y сравниваются как равные, обработка их по type приведет к поведению. Однако, поскольку x является экземпляром подкласса list , использование isinstance(x,list) дает желаемое поведение и обрабатывает x и y таким же образом.

Есть ли эквивалент isscalar () в numpy? Да.

 >>> np.isscalar(3.1) True >>> np.isscalar([3.1]) False >>> np.isscalar(False) True 

Хотя подход @ jamylak является лучшим, вот альтернативный подход

 >>> N=[2,3,5] >>> P = 5 >>> type(P) in (tuple, list) False >>> type(N) in (tuple, list) True 

Другой альтернативный подход (использование свойства имени класса):

 N = [2,3,5] P = 5 type(N).__name__ == 'list' True type(P).__name__ == 'int' True type(N).__name__ in ('list', 'tuple') True 

Не нужно ничего импортировать.

Вы можете проверить тип данных переменной.

 N = [2,3,5] P = 5 type(P) 

Он выдаст вам значение типа данных P.

 <type 'int'> 

Чтобы вы могли отличить это, это целое число или массив.

 >>> N=[2,3,5] >>> P = 5 >>> type(P)==type(0) True >>> type([1,2])==type(N) True >>> type(P)==type([1,2]) False 

Я удивлен, что такой базовый вопрос, похоже, не имеет прямого ответа на питоне. Мне кажется, что почти все предлагаемые ответы используют некоторую проверку типов, обычно не рекомендуется в python, и они, по-видимому, ограничены конкретным случаем (они терпят неудачу с разными численными типами или универсальными итерационными объектами, которые не являются кортежами или списками).

Для меня лучше работает импорт numpy и использование array.size, например:

 >>> a=1 >>> np.array(a) Out[1]: array(1) >>> np.array(a).size Out[2]: 1 >>> np.array([1,2]).size Out[3]: 2 >>> np.array('125') Out[4]: 1 

Также обратите внимание:

 >>> len(np.array([1,2])) Out[5]: 2 

но:

 >>> len(np.array(a)) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-40-f5055b93f729> in <module>() ----> 1 len(np.array(a)) TypeError: len() of unsized object 

Просто используйте size вместо len !

 >>> from numpy import size >>> N = [2, 3, 5] >>> size(N) 3 >>> N = array([2, 3, 5]) >>> size(N) 3 >>> P = 5 >>> size(P) 1 
Python - лучший язык программирования в мире.