Использование 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Альтернатива хорошо знать, но вы должны также понять эту ошибку.