안녕하세요. 지난 시간의 넘파이 알고 쓰자 - 문자열 연산 2에서는 몇 가지 문자열과 관련된 연산들에 대해서 추가적으로 알아보았습니다. 오늘은 이에 이어서 문자열을 비교해주는 몇 가지 함수에 대해서 알아보도록 하겠습니다.
1. numpy.char.equal(x1, x2), numpy.char.not_equal(x1, x2)
이 함수들은 이름에서 보이다 싶이 두 문자열을 구성하는 각 문자를 비교하는 연산입니다. 간단한 예시를 들어서 설명해보도록 하겠습니다.
numpy_string1 = np.array([["Hello", "my", "name", "is", "jane"]])
numpy_string2 = np.array([["Hello", "his", "name", "is", "mike"]])
np.char.equal(numpy_string1, numpy_string2)
# array([[ True, False, True, True, False]])
np.char.not_equal(numpy_string1, numpy_string2)
# array([[False, True, False, False, True]])
상단의 코드에서는 두 넘파이 배열을 원소별로 비교하게 됩니다. "Hello"와 "Hello", "my"와 "his"와 같이 비교합니다. 그 결과 동일한 문자열을 불리안 타입의 넘파이 배열로 반환하는 것을 볼 수 있습니다. 대응되는 np.char.equal 함수에서는 두 문자열이 같다면 True, 다르다면 False를 반환합니다. np.char.not_equal 함수에서는 두 문자열이 다르면 True, 같으면 False를 반환하는 것을 볼 수 있습니다. 이렇게 예제로 쉽게 확인해보실 수 있습니다.
2. numpy.char.greater_equal(x1, x2), numpy.char.less_equal(x1, x2)
이제부터는 문자열들 사이의 대소관계를 파악하는 함수들을 알아보도록 하겠습니다. 기본적으로 문자열은 컴퓨터의 내부적으로 ASCII 코드라는 것을 기반으로 저장됩니다. ASCII 코드란 0~127까지 총 128개의 문자들을 넘버링으로 표현한 것입니다. 예를 들어, "A"는 ASCII 코드 상으로 65이고 "a"는 97입니다. 그래서 문자들 사이의 대소 관계를 하게 되면 이 ASCII 코드를 기반으로 비교하게 됩니다. 위의 예시에서는 "A"의 ASCII 코드보다 "a"의 ASCII 코드보다 더 작기 때문에 A < a는 참이 되고 A >= a는 거짓이 됩니다. 문자열에서는 문자열에 대응되는 각 문자열을 비교하게 됩니다. 아래의 예시를 보도록 하겠습니다.
numpy_string1 = np.array([["Hello", "my", "name", "is", "jane"]])
numpy_string2 = np.array([["Hello", "his", "name", "is", "mike"]])
np.char.greater_equal(numpy_string1, numpy_string2)
# array([[ True, True, True, True, False]])
np.char.less_equal(numpy_string1, numpy_string2)
# array([[ True, False, True, True, True]])
두번째 문자열에 주목하시면 my와 his를 비교하고 있습니다. 방금 제가 말씀드린 ASCII 코드를 참조해보시면 m = 109, y = 121 이고, h = 104, i = 105, s = 115 임을 쉽게 알 수 있습니다. 두 문자열을 비교할 때는 가장 앞의 요소부터 비교하시면 됩니다. 그런데 m(109) >=h(104) 이기 때문에 바로 np.char.greater_equal 함수에서는 참을 반환하고 np.char.less_equal 함수에서는 거짓을 반환하게 됩니다. 이와 비슷한 함수로 np.char.greater, np.char.less 함수가 있습니다. 이 함수들은 >, < 만 검사하는 함수로 방금 설명드린 함수에서 =를 빼고 검사하는 것과 동일하기 때문에 생략하도록 하겠습니다.
3. numpy.char.compare_chararrays(a, b, cmp_op, rstrip)
이 함수들은 위에서 언급한 모든 함수들을 하나로 묶어서 만든 함수입니다. a, b 에는 비교할 두 문자열, cmp_op에서는 어떤 방식으로 비교할 것인지 넣어주면 되는 데 np.char.equal -> "==", np.char.not_equal -> "!=", np.char.greater_equal -> ">=", np.char.less_equal -> "<=", np.char.greater -> ">", np.char.less -> "<"를 넣어주면 됩니다. 아주 간단하죠? 마지막으로 rstrip은 비교하기 전에 오른쪽 공백을 제거하고 할 것인지를 True/False로 입력해주시면 됩니다. 예제를 보도록 하겠습니다.
a = np.array(["a", "b", "cde"])
b = np.array(["a", "a", "dec"])
np.compare_chararrays(a, b, ">", True)
# array([False, True, False])
이 경우에는 두 문자열 배열을 비교할 때 np.char.greater 함수를 이용하겠다는 것을 의미합니다.
'Programming > Python' 카테고리의 다른 글
넘파이 알고 쓰자 - 삼각함수(Trigonometric functions) (1) | 2020.11.04 |
---|---|
넘파이 알고 쓰자 - 문자열 정보 추출 (0) | 2020.10.15 |
넘파이 알고 쓰자 - 문자열 연산 2 (0) | 2020.10.04 |
넘파이 알고 쓰자 - 문자열 연산 1 (0) | 2020.09.14 |
넘파이 알고 쓰자 - Bit packing & output formatting (0) | 2020.09.13 |