파이썬에서 이미지나 리스트 등 array 형태의 무언가를 다루다 보면 다음과 같은 에러가 발생합니다.
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
에러의 뜻은 말 그대로 "하나 이상의 원소를 가진 array의 참값은 판정하기 모호하니까, 하나의 값으로 줘라~" 이겁니다.
예시를 들자면 다음과 같습니다. 어떤 이미지가 다른 이미지와 같다는 조건문을 넣고 싶을 때,
img1 = cv2.imread("car.png")
img2 = cv2.imread("car.png")
if img1 == img2:
print("같은 그림")
-----------------------------------------------------
ValueError Traceback (most recent call last)
Cell In [38], line 1
----> 1 if img1 == img2:
2 print("같은 그림")
ValueError: The truth value of an array with more
than one element is ambiguous. Use a.any() or a.all()
같은 그림을 불러와서 같은 지 확인했는데 왜 안될까요?
>>> img1 == img2
array([[[ True, True, True],
[ True, True, True],
[ True, True, True],
...,
[ True, True, True],
[ True, True, True],
[ True, True, True]],
[[ True, True, True],
[ True, True, True],
[ True, True, True],
...,
[ True, True, True],
[ True, True, True],
[ True, True, True]],
[[ True, True, True],
[ True, True, True],
[ True, True, True],
...,
[ True, True, True],
[ True, True, True],
[ True, True, True]],
...,
바로 img1==img2 결과 자체가 array 형태이기 때문입니다. if 문이 array의 어느 부분을 보고 참/거짓을 판별할지를 모르는 겁니다. 그래서 파이썬의 numpy는. all()과. any()라는 메서드를 가지고 있습니다!
- . all(): 모든 값이 True면 True, 하나라도 False면 False 반환
- . any(): 하나라도 True면 True, 모두 False면 False 반환
그래서 위처럼 조건문을 쓰고 싶으면, 다음과 같이 사용합시다.
>>>if (img1 == img2).all():
... print("같은 그림")
같은 그림
같은 그림을 비교할 때 (img1 == img2).all()은 True니까 (img1 == img2).all() is True라는 코드도 True가 나오겠죠?
절대 아닙니다.
>>>(img1 == img2).all() is True
False
왜 False인지는 type을 비교해보면 알 수 있습니다.
>>>print(type((img1 == img2).all()), type(True))
<class 'numpy.bool_'> <class 'bool'>
타입이 다르므로 위 조건문에서는 False를 반환하는 겁니다.