Подтвердить что ты не робот

ValueError при проверке, является ли переменная None или numpy.array

Я хочу проверить, есть ли переменная None или numpy.array. Я реализовал функцию check_a, чтобы сделать это.

def check_a(a):
    if not a:
        print "please initialize a"

a = None
check_a(a)
a = np.array([1,2])
check_a(a)

Но этот код вызывает ValueError. Что такое прямой путь?

ValueError                                Traceback (most recent call last)
<ipython-input-41-0201c81c185e> in <module>()
      6 check_a(a)
      7 a = np.array([1,2])
----> 8 check_a(a)

<ipython-input-41-0201c81c185e> in check_a(a)
      1 def check_a(a):
----> 2     if not a:
      3         print "please initialize a"
      4 
      5 a = None

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
4b9b3361

Ответ 1

Использование not a для проверки того, a ли a None предполагает, что другие возможные значения a имеют значение истинности True. Однако большинство массивов NumPy вообще не имеют значения истинности и not могут быть применены к ним.

Если вы хотите, чтобы проверить объект не является ли None, самый общий, надежный способ заключается в буквальном смысле использовать is чек против None:

if a is None:
    ...
else:
    ...

Это не зависит от объектов, имеющих значение истинности, поэтому оно работает с массивами NumPy.

Обратите внимание, что тест должен быть is, а не ==. is является тестом идентичности объекта. == это то, что аргументы говорят, что это, а массивы NumPy говорят, что это транслируется сравнение поэлементного равенства, производя логический массив:

>>> a = numpy.arange(5)
>>> a == None
array([False, False, False, False, False])
>>> if a == None:
...     pass
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous.
 Use a.any() or a.all()

С другой стороны, если вы хотите проверить, является ли объект массивом NumPy, вы можете проверить его тип:

# Careful - the type is np.ndarray, not np.array. np.array is a factory function.
if type(a) is np.ndarray:
    ...
else:
    ...

Вы также можете использовать isinstance, который также вернет True для подклассов этого типа (если это то, что вы хотите). Учитывая, насколько ужасен и несовместим np.matrix, вы, возможно, не захотите этого:

# Again, ndarray, not array, because array is a factory function.
if isinstance(a, np.ndarray):
    ...
else:
    ...    

Ответ 2

Вы можете видеть, имеет ли объект форму или нет

def check_array(x):
    try:
        x.shape
        return True
    except:
        return False

Ответ 3

Если вы пытаетесь сделать что-то очень похожее: a is not None, возникает та же проблема. То есть Numpy жалуется, что нужно использовать a.any или a.all.

Обходной путь должен сделать:

if not (a is None):
    pass

Не слишком красиво, но это делает работу.