Ответ 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:
...