반응형
if문 넘파이 배열 비교 연산자 ValueError 디버깅
비교문에서 numpy array 등 자료형에 대한 ==, != 연산 적용 시 등장할 수 있는
"ValueError: The truth value of an array with more than one element is
ambiguous. Use a.any() or a.all()"
오류에 대하여 원인과 해결 방안을 다루어보도록 하겠습니다.
(참고 : 판다스 시리즈 등 자료형에서도 비슷한 종류의 오류 발생이 가능합니다.)
에러 원인
아래는 두 넘파이 배열이 같은지를 if문 내에서 비교하려는 예시입니다.
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([1, 2, 3, 4])
if a == b:
print("a와 b가 같습니다!")
그러나, 위 코드 실행 시 글 맨 위에서 언급했던 메시지 내용의 ValueError가 발생합니다.
반응형
a == b의 결과를 자세히 살펴보면 다음과 같습니다.
a == b
# array([ True, True, True, True])
이는 넘파이 배열의 비교 연산 정의에 의하여 True/False로 바로 반환되기 보다는
각 위치의 자료가 일치하는지 여부를 각각 True/False로 취급하여 등장하는 것이며,
배열 자체가 참으로 취급되어야 하는지 혹은 거짓으로 취급되어야 하는지에 대한
여부가 불분명하기 때문입니다.
에러 해결 방법
오류 메시지에 표현된대로 any 혹은 all 연산을 적용하여 최종 True/False 값을 반환받으며
해결이 가능합니다.
모든 위치의 값이 True인지를 체크하고 싶다면 all 연산을,
단 1개라도 True인지를 체크하고 싶다면 any 연산을 적용해주시면 됩니다.
if (a == b).all():
print("a와 b가 같습니다!")
# 결과 : array 내의 모든 값들이 True이기 때문에 print문 실행