Использование not 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:
...
ValueError
один из самых частыхnumpy
вопросов. Это означает, чтоnot a
создается логический массив с (в данном случае) двумя значениями. Этот логический массив нельзя использовать в качествеif
условия!is None
Альтернатива хорошо знать, но вы должны также понять эту ошибку.