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


104

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

2
이것은 ValueError가장 일반적인 numpy질문 중 하나입니다 . 이는 not a(이 경우) 2 개의 값이있는 부울 배열을 생성 함을 의미 합니다. 이 부울 배열은 if조건 으로 사용할 수 없습니다 ! is None대안은 알고하는 것이 좋다, 그러나 당신은 또한이 오류를 이해해야합니다.
hpaulj

@hpaulj : 정답이 아닙니다. 오버로드를 할 수 없으므로 배열을 단일 부울로 처리하려고 할 not때 오류가 실제로 발생 not합니다. 이었다면 ~aNumPy의 오버로드 if를 사용하고 부정 배열을 단일 부울로 사용하려고 할 때 실패했을 것 입니다.
user2357112 모니카 지원

답변:


175

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

4
"최상의"솔루션은 무엇을 권장합니까?
Monica Heddneck 2019

2

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

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

if not (a is None):
    pass

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


0

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

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

1
다른 유형도 shape 속성을 가질 수 있으며 다른 의미를 가질 수도 있습니다.
Herbert
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.