안녕하세요. 지난 포스팅의 넘파이 알고 쓰자 - 문자열 비교에 이어서 문자열이 가진 여러가지 정보를 추출하는 방법이 대해서 알아보도록 하겠습니다. 오늘이 넘파이와 문자열과 관련된 마지막 포스팅이 될 거 같습니다.
파이썬을 해보신분들은 알겠지만 문자열을 이용해서 다양한 작업을 합니다. 그 중에서 자주 사용되는 count 함수는 서브문자열의 개수를 문자열에서 counting 해줍니다. 또한 find 함수와 index 함수의 경우에는 특정 문자열의 위치를 알려주기도 합니다. 이뿐만 아니라 훨씬 더 다양한 문자열 정보를 추출해볼 수 있습니다. 예를 들어서 문자열이 숫자로 이루어져 있는 지, 소문자로 이루어져 있는 지, 대문자로 이루어져 있는 지와 같이 상세한 정보도 알아볼 수 있습니다. 이제부터 본격적으로 하나씩 확인해보도록 하겠습니다.
1. numpy.char.count(a, sub, start=0, end=None)
이 함수는 기존의 파이썬 문자열이 지니고 있는 count 함수도 동일합니다. 바로 예를 들어서 알아보도록 하겠습니다.
c = np.array(['aAaAaA', ' aA ', 'abBABba'])
np.char.count(c, 'A')
# array([3, 1, 1])
np.char.count(c, 'aA')
# array([3, 1, 0])
np.char.count(c, 'A', start=1, end=4)
# array([2, 1, 1])
np.char.count(c, 'A', start=1, end=3)
# array([1, 1, 0])
먼저 문자열 배열을 선언합니다. 첫번째 count 함수를 보면 서브문자열로 "A"를 찾도록 하였습니다. 그 결과 배열의 각 요소별 문자열이 가지고 있는 "A"의 개수를 반환합니다. 그래서 첫번째 문자열에는 "A"가 3개 있으므로 3, 두번째 문자열에는 1개 있으므로 1, 마지막 문자열에는 1개 있으므로 1을 반환하여 [3, 1, 1]이라는 결과를 얻을 수 있습니다.
두번째 count 함수는 서브문자열로 "aA"를 찾도록 하였습니다. 이 기능은 단순히 첫번째 count 함수에서 찾는 서브문자열만 바꾼 것이기 때문에 쉽게 이해하실수 있을 것입니다.
세번째 count 함수는 첫번째 count 함수와 마찬가지로 서브문자열 "A"의 개수를 찾는 것을 목표로 하지만 추가적인 인자로 start, end가 추가되었습니다. 이 인자는 문자열을 검색하는 searching space를 정의하는 것으로 첫번째 문자열 같은 경우에는 "aAaAaA"이기 때문에 start=1, end=4이면 "AaAa"만 검색하여 그 결과 2개의 "A"를 얻을 수 있습니다. 이 기능은 네번째 count 함수에서도 동일하게 사용되었습니다.
2. numpy.char.find(a, sub, start=0, end=None) & numpy.char.index(a, sub, start=0, end=None)
방금까지본 count 함수는 서브문자열의 개수를 반환하는 함수였다면 이번에는 문자열과 첫번째로 일치하는 서브문자열의 시작위치를 반환하는 함수입니다. find 함수와 index 함수 모두 동일한 기능을 하는 함수입니다. 실제로 기존의 문자열에서도 find 함수와 index 함수 2개가 존재합니다. 하지만 2개에는 굉장히 큰 차이점이 있습니다. find 함수는 만약 서브문자열이 검색하려는 문자열에 존재하지 않는다면 -1을 반환하지만 index 함수같은 경우에는 ValueError를 반환하여 프로그램이 멈추게 됩니다. 어떤 것을 사용할 것인지는 여러분들이 자유롭게 정하시면 됩니다. 간단한 예시를 보도록 하겠습니다.
= np.array(['aAaAaA', ' aA ', 'abBABba'])
np.char.find(c, 'a')
# array([0, 1, 0])
np.char.find(c, 'B')
# array([-1, -1, 2])
np.char.index(c, 'a')
# array([0, 1, 0])
np.char.index(c, 'B')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-11-1a807ab04d28> in <module>
10 # array([0, 1, 0])
11
---> 12 np.char.index(c, 'B')
<__array_function__ internals> in index(*args, **kwargs)
~/miniconda3/envs/MOD777/lib/python3.8/site-packages/numpy/core/defchararray.py in index(a, sub, start, end)
743
744 """
--> 745 return _vec_string(
746 a, int_, 'index', [sub, start] + _clean_args(end))
747
ValueError: substring not found
위의 코드를 참조해보면 서브문자열이 문자열에 있다면 오류가 발생하지 않고 find 함수, index 함수가 동일한 결과를 반환하게 됩니다. 하지만 찾으려는 문자열이 존재하지 않으면 find는 해당 문자열에 -1을 반환하고 끝이지만 index 함수는 ValueError를 반환합니다.
3.numpy.char.isdigit(a)
이 함수는 해당 문자열이 숫자로만 이루어져있는 지 확인하는 함수입니다. 예를 들어 문자열 "123" 같은 경우에는 숫자인 문자(말이 조금 이상하지만)로만 이루어져있습니다. 따라서 이 경우에는 True를 반환합니다. 그에 반해 "123q"는 문자열안에 숫자인 문자와 그냥 문자가 섞여있기 때문에 False입니다. 아래의 예제를 보시면 바로 이해가 가실겁니다.
c = np.array(['aAaAaA', ' aA ', '123', '1q2w3e4r'])
np.char.isdigit(c)
# array([False, False, True, False])
4. numpy.char.islower(a) & numpy.char.isupper(a)
이 함수들은 문자열이 소문자로만 이루어져있는지, 또는 대문자로만 이루어져 있는 지 확인합니다. 이 함수 역시 간단한 개념이기 때문에 예제만 보고 넘어가도록 하겠습니다.
c = np.array(['aAaAaA', ' aA ', 'AAA', 'aaa'])
np.char.islower(c)
# array([False, False, False, True])
np.char.isupper(c)
# array([False, False, True, False])
예제 코드를 보시면 첫번째 문자열과 두번째 문자열은 소문자와 대문자가 섞여있기 때문에 계속 False가 나오게 됩니다.
5. numpy.char.isalpha(a)
이 함수는 isdigit 함수와 매우 유사하지만 검사하는 대상이 숫자인 문자가 아닌 알파벳으로 이루어져있는 지 검사합니다.
c = np.array(['aAaAaA', ' aA ', 'AAA', 'aaa', '1q2w3e4r'])
np.char.isalpha(c)
# array([ True, False, True, True, False])
예를 들어 위의 코드에서 두번째 문자열은 공백이 포함되어 있기 때문에 False를 반환하고 마지막 문자열은 숫자인 문자가 포함되어 있기 때문에 False를 반환하게 됩니다.
6. numpy.char.str_len(a)
마지막으로 문자열에서 빠질 수 없는 중요한 함수는 길이를 반환하는 함수를 알아보고 마치도록 하겠습니다. 이 함수는 문자열 넘파이 배열의 각 요소에 해당하는 문자열의 길이를 반환하는 함수입니다.
c = np.array(['aAaAaA', ' aA ', 'AAA', 'aaa', '1q2w3e4r'])
np.char.str_len(c)
# array([6, 4, 3, 3, 8])
오늘 포스팅은 여기서 마치도록 하겠습니다. 사실 문자열 정보는 이와 말고도 몇 가지가 더 있지만 제가 생각했을 때 많이 쓰이고 중요하다고 생각되는 몇몇 정보만 다루었으니 혹시 더 많은 정보를 알고 싶으시다면 넘파이 공식 홈페이지를 방문해보시면 될 거 같습니다.
'Programming > Python' 카테고리의 다른 글
넘파이 알고 쓰자 - 쌍곡선 함수(Hyperbolic functions) (0) | 2020.11.06 |
---|---|
넘파이 알고 쓰자 - 삼각함수(Trigonometric functions) (1) | 2020.11.04 |
넘파이 알고 쓰자 - 문자열 비교 (0) | 2020.10.10 |
넘파이 알고 쓰자 - 문자열 연산 2 (0) | 2020.10.04 |
넘파이 알고 쓰자 - 문자열 연산 1 (0) | 2020.09.14 |