안녕하세요. 최근 바빠서 포스팅을 못했는 데 오랜만에 진행해보도록 하겠습니다. 지난 포스팅 넘파이 알고 쓰자 - 문자열 연산 1에서 기존 파이썬에서 존재하는 문자열 연산을 넘파이를 이용해서 처리하는 방법에 대해서 알아보았습니다. 나중에 대용량의 문자열을 처리할 때 넘파이를 이용해서 처리한다면 for loop를 이용해서 하나하나 처리하는 것보다 넘파이의 vectorization을 통해서 더 빠르게 처리할 수 있겠죠? 오늘 포스팅에서도 이어서 확인해보도록 하겠습니다.
1.numpy.char.join(sep1, seq2)
파이썬에서 join 함수를 기억하시나요? 파이썬에서 문자열 리스트가 주어졌을 때 이들을 어떤 값을 사이사이에 넣고 하나의 큰 문자열로 합치는 메서드였습니다. 예를 들어, 아래와 같습니다.
a = ["John", "Peter", "Vicky"]
x = "&".join(a)
print(x)
넘파이의 join 함수에서는 첫번째 인자(seq1)가 삽입할 문자 및 문자열, 두번째 인자(seq2)가 바꿀 문자열입니다. 다만, 넘파이에서는 기존의 파이썬 함수와는 다르게 넘파이 배열의 각 요소에 seq1를 삽입하게 됩니다. 예를 들어 아래와 같습니다.
a = np.array(["John", "Peter", "Vicky"])
np.char.join('&', a)
# array(['J&o&h&n', 'P&e&t&e&r', 'V&i&c&k&y'], dtype='<U9')
이와 같이 John이라는 문자열에 '&'를 중간에 삽입하는 것을 볼 수 있습니다. 다른 요소 역시 마찬가지입니다.
2.numpy.char.partition(a, sep)
다음은 파이썬의 partition 함수입니다. 기존의 파이썬에서 이 함수는 a라는 문자열에서 seq라는 서브 문자열을 검색합니다. 만약 해당 서브 문자열이 존재한다면 그 문자열을 중심으로 앞뒤로 나누어(partition) 튜플로 반환하는 함수입니다. 예를 들어 아래와 같습니다.
txt = "I could eat bananas all day"
x = txt.partition("bananas")
print(x) # ('I could eat ', 'bananas', ' all day')
아주 간단하고 쉬운 함수입니다. 다만 존재하지 않는다면 아래와 같이 전체 문자열을 반환하게 됩니다.
txt = "I could eat bananas all day"
x = txt.partition("apple")
print(x) # ('I could eat bananas all day', '', '')
이번에는 넘파이의 partition 함수를 이용하도록 하겠습니다.
txt = np.array([["I could eat bananas all day"],
["I ate bananas yesterday"],
["I will eat bananas next day"]])
np.char.partition(txt, "bananas")
# array([[['I could eat ', 'bananas', ' all day']],
# [['I ate ', 'bananas', ' yesterday']],
# [['I will eat ', 'bananas', ' next day']]], dtype='<U12')
이런 식으로 3개의 문자열이 넘파이 배열로 존재한다고 할 때 'bananas'라는 문자열을 중심으로 입력된 문자열을 분할(partition)해주는 모습을 볼 수 있습니다.
3.numpy.char.lstrip(a, chars=None), numpy.char.lstrip(a, chars=None), numpy.char.strip(a, chars=None)
다음은 문자열의 전처리에 자주 사용되는 함수이빈다. 뉴스나 기사를 크롤링을 하게 되면 가끔 글의 양쪽에 필요없는 공백이 있는 경우가 많습니다. 이는 전처리 과정에서 필수적으로 제거해주는 요소입니다. 이때, 현재 문자열을 중심으로 왼쪽의 공백만 제거할 수도 있고, 오른쪽의 공백만 제거할 수도 있고, 양쪽의 모든 공백을 제거할 수 있습니다. 사용되는 각 함수를 lstrip, rstrip, strip이라고 합니다. 이는 바로 넘파이 배열을 이용해서 확인해보도록 하겠습니다.
c = np.array([[' aAaAaA ', ' aA ', 'abBABba'],
[' aAa AaA ', 'a A ', 'abBA Bba ']])
np.char.lstrip(c)
# array([['aAaAaA ', 'aA ', 'abBABba'],
# ['aAa AaA ', 'a A ', 'abBA Bba ']], dtype='<U16')
np.char.rstrip(c)
# array([[' aAaAaA', ' aA', 'abBABba'],
# [' aAa AaA', 'a A', 'abBA Bba']], dtype='<U16')
np.char.strip(c)
# array([['aAaAaA', 'aA', 'abBABba'],
# ['aAa AaA', 'a A', 'abBA Bba']], dtype='<U16')
여기서 chars 인자는 어떤 문자를 제거할 지 결정하는 인자입니다. 위의 코드 같은 경우에는 chars에 아무것도 입력하지 않았습니다. 이 경우에는 항상 공백을 제거하도록 되어있습니다. 다른 문자를 제거하고 싶다면 아래와 같이 입력하시면 됩니다. 이전 코드와 동일한 넘파이 배열을 사용했을 때 결과가 다른 것을 확인할 수 있습니다.
c = np.array([[' aAaAaA ', ' aA ', 'abBABba'],
[' aAa AaA ', 'a A ', 'abBA Bba ']])
np.char.lstrip(c, chars='a')
# array([[' aAaAaA ', ' aA ', 'bBABba'],
# [' aAa AaA ', ' A ', 'bBA Bba ']], dtype='<U16')
np.char.rstrip(c, chars='a')
# array([[' aAaAaA ', ' aA ', 'abBABb'],
# [' aAa AaA ', 'a A ', 'abBA Bba ']], dtype='<U16')
np.char.strip(c, chars='a')
# array([[' aAaAaA ', ' aA ', 'bBABb'],
# [' aAa AaA ', ' A ', 'bBA Bba ']], dtype='<U16')
문자열 연산에 대한 설명은 여기까지 하도록 하겠습니다. 지난 포스팅부터 오늘 포스팅까지는 전부 문자열 연산에 대해서 간략하게 설명하였습니다. 넘파이에서는 더욱 다양하고 강력한 문자열 연산 함수를 제공하고 있습니다. 직접 확인하고 코딩을 짜보신다면 더욱 쉽게 이해가 가실 것입니다. 다음 포스팅에서는 두 문자열을 비교하는 함수에 대해서 알아보겠습니다.
'Programming > Python' 카테고리의 다른 글
넘파이 알고 쓰자 - 문자열 정보 추출 (0) | 2020.10.15 |
---|---|
넘파이 알고 쓰자 - 문자열 비교 (0) | 2020.10.10 |
넘파이 알고 쓰자 - 문자열 연산 1 (0) | 2020.09.14 |
넘파이 알고 쓰자 - Bit packing & output formatting (0) | 2020.09.13 |
넘파이 알고 쓰자 - Elementwise bit operations (0) | 2020.09.08 |