[python] 변수가 None 또는 numpy.array인지 확인할 때 ValueError

변수가 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()



답변

사용 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:
    ...    


답변

매우 유사한 작업을 시도하는 경우 : a is not None, 동일한 문제가 발생합니다. 즉, Numpy는 a.any또는a.all .

해결 방법은 다음과 같습니다.

if not (a is None):
    pass

너무 예쁘지는 않지만 작업을 수행합니다.


답변

물체의 모양이 있는지 확인할 수 있습니다.

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


답변