Я хотел бы проверить, является ли переменная 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()
ValueError
один из самых частыхnumpy
вопросов. Это означает, чтоnot a
создается логический массив с (в данном случае) двумя значениями. Этот логический массив нельзя использовать в качествеif
условия!is None
Альтернатива хорошо знать, но вы должны также понять эту ошибку.not
, поэтому ошибка на самом деле возникает, когдаnot
пытается обработать массив как одно логическое значение и обнаруживает, что это невозможно. Если бы это было так~a
, это использовало бы перегрузку NumPy и не удалосьif
бы использовать отрицательный массив как одно логическое значение.Ответы:
Использование
not a
для проверки тогоa
,None
предполагает ли это, что другие возможные значенияa
имеют значение истинностиTrue
. Однако большинство массивов NumPy вообще не имеют значения истинности иnot
не могут быть к ним применены.Если вы хотите проверить, существует ли объект
None
, наиболее общий и надежный способ - буквально использоватьis
проверкуNone
:Это не зависит от объектов, имеющих значение истинности, поэтому работает с массивами NumPy.
Учтите, что тест должен быть
is
, а не==
.is
это тест на идентичность объекта.==
это то, что аргументы говорят, а массивы NumPy говорят, что это транслируемое поэлементное сравнение равенства, производящее логический массив:С другой стороны, если вы хотите проверить, является ли объект массивом NumPy, вы можете проверить его тип:
Вы также можете использовать
isinstance
, который также будет возвращенTrue
для подклассов этого типа (если вы этого хотите). Учитывая, насколько это ужасно и несовместимоnp.matrix
, вы можете этого не захотеть:источник
Если вы пытаетесь сделать что-то очень похожее:,
a is not None
возникает та же проблема. То есть Numpy жалуется, что нужно использоватьa.any
илиa.all
.Обходной путь:
Не очень красиво, но работает.
источник
Вы можете увидеть, имеет ли объект форму или нет
источник