python: how to identify if a variable is an array or a scalar

后端 未结 14 1336
半阙折子戏
半阙折子戏 2020-12-22 16:13

I have a function that takes the argument NBins. I want to make a call to this function with a scalar 50 or an array [0, 10, 20, 30].

相关标签:
14条回答
  • 2020-12-22 17:03

    Combining @jamylak and @jpaddison3's answers together, if you need to be robust against numpy arrays as the input and handle them in the same way as lists, you should use

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

    This is robust against subclasses of list, tuple and numpy arrays.

    And if you want to be robust against all other subclasses of sequence as well (not just list and tuple), use

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

    Why should you do things this way with isinstance and not compare type(P) with a target value? Here is an example, where we make and study the behaviour of NewList, a trivial subclass of list.

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

    Despite x and y comparing as equal, handling them by type would result in different behaviour. However, since x is an instance of a subclass of list, using isinstance(x,list) gives the desired behaviour and treats x and y in the same manner.

    0 讨论(0)
  • 2020-12-22 17:04

    Since the general guideline in Python is to ask for forgiveness rather than permission, I think the most pythonic way to detect a string/scalar from a sequence is to check if it contains an integer:

    try:
        1 in a
        print('{} is a sequence'.format(a))
    except TypeError:
        print('{} is a scalar or string'.format(a))
    
    0 讨论(0)
  • 2020-12-22 17:06

    I am surprised that such a basic question doesn't seem to have an immediate answer in python. It seems to me that nearly all proposed answers use some kind of type checking, that is usually not advised in python and they seem restricted to a specific case (they fail with different numerical types or generic iteratable objects that are not tuples or lists).

    For me, what works better is importing numpy and using array.size, for example:

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

    Note also:

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

    but:

    >>> 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
    
    0 讨论(0)
  • 2020-12-22 17:09

    preds_test[0] is of shape (128,128,1) Lets check its data type using isinstance() function isinstance takes 2 arguments. 1st argument is data 2nd argument is data type isinstance(preds_test[0], np.ndarray) gives Output as True. It means preds_test[0] is an array.

    0 讨论(0)
  • 2020-12-22 17:10
    >>> isinstance([0, 10, 20, 30], list)
    True
    >>> isinstance(50, list)
    False
    

    To support any type of sequence, check collections.Sequence instead of list.

    note: isinstance also supports a tuple of classes, check type(x) in (..., ...) should be avoided and is unnecessary.

    You may also wanna check not isinstance(x, (str, unicode))

    0 讨论(0)
  • 2020-12-22 17:12

    To answer the question in the title, a direct way to tell if a variable is a scalar is to try to convert it to a float. If you get TypeError, it's not.

    N = [1, 2, 3]
    try:
        float(N)
    except TypeError:
        print('it is not a scalar')
    else:
        print('it is a scalar')
    
    0 讨论(0)
提交回复
热议问题