투자자/알고리즘

파이썬_ numpy array에서 문자열 찾아 바꿔넣기

나그네_즈브즈 2021. 4. 26. 14:13

 

 

 

문자열로 채워진 어떤 표가 있다. 이 행렬의 이름을 A라고 하자. 여기서 특정 단어만을 찾아 원하는 다른 단어로 바꿔넣고 싶다면? 가령, 나는 알파벳 b가 포함된 것들을 찾아 모두 x로 바꾸고 싶다. 이 작업에 성공한다면, 재무제표가 담긴 엑셀 파일을 numpy array로 불러왔을 때 다양하게도 못생긴 단어들을 표준적인 모습으로 한꺼번에 바꿔줄 수 있게 된다.

 

얼른 생각하면, 반복문을 이용해 노가다를 시키는 방법을 떠올려 볼 수 있다. 노가다가 필요한 표가 하나뿐이면 괜찮을 수 있다. 하지만 엑셀파일 수 만 개를 불러와 그 안의 모든 단어를 돌아다녀야 한다면 얘기가 달라진다. 게다가 파이썬에서 행렬을 다루는 기가 막힌 도구를 제공하니까 굳이 그런 원시성에 향수를 느낄 필요는 없다.

 

엑셀의 IF 함수에는 조건 하나와 값 두 개를 입력한다. 조건에 해당하면 첫 번째 값을 주고, 아니면 두 번째 값을 돌려준다. 나의 경우처럼 문자열을 바꿔주고 싶을 때 이용할 만한 로직이다. 조건을 만족하면 바꿀 단어를 뱉어내고, 아니라면 그대로 두면 될 일이다.

 

비슷한 기능을 하는 함수가 파이썬의 numpy에도 있다. .where() 함수를 이용하면 된다. 마찬가지로 조건 하나와 값 두 개를 입력해주면 된다. 여기서 .where() 함수가 행렬을 다루는 함수라는 이점을 극대화할 수 있다. 예를 들어, 숫자들이 가득 들어있는 어떤 행렬이 있는데, 이곳의 모든 원소를 제곱한 새로운 행렬을 만들려고 한다. 행렬을 다룰 수 있는 함수가 있다면, 행렬을 통째로 변수로 넣어주면 된다. 원소를 하나하나 집어서 제곱할 필요없이, 계산이 끝난 새로운 행렬이 곧바로 튀어나오게 되고 속도도 훨씬 빠르다.

 

numpy의 .where() 함수도 행렬을 입력받고 행렬을 출력해줄 수 있다. B = numpy.where(numpy.isin(A, 'b'), x, A) 라고 입력해보자. 여기서 x는 바꿔넣어 줄 문자, A는 조건이 불발됐을 때 나타낼 행렬이다. numpy.isin(A, 'b')가 조건이다. 이 조건에 만족하는 부분을 추려내는 마스크(모양자) 역할을 하는 행렬이다. 이 입력변수들을 그림으로 나타내면

 

 

 

 

이렇게 보일 수 있다. 주황색 마스크는 입력된 조건을 만족하는 자리가 뚫린 행렬이다. x는 입력해야 할 자리에 넣을 새로운 단어로 이루어진 행렬이고, 가장 마지막 A는 조건이 불발되어 모양자의 막힌 자리에 채워질 단어들로 구성된 행렬이다. 따라서 이렇게 작업을 해주면, 그 결과도 행렬의 형식으로 나타나게 된다. 

 

파이썬의 기본 객체들 중 문자열 변수에서는 특정 글자를 찾아 바꿔주는 .replace() 함수가 지원된다. 하지만 numpy 클래스에서는 그런 기능이 없으니, 직접 만들어서 쓸 수밖에 없다. 행렬을 다루어주는 .where() 함수가 처리속도를 확보하는 데에 정적 역할을 할 수 있다. 여기서 가장 중요한 포인트는 입력변수(조건, 대체값, 유지값)들을 행렬로 간추려 주는 단계이다. 여기서 예시로 사용된 .isin() 함수가 꼭 아니더라도, 조건문 자리에는 참/거짓으로 된 모양자가 들어가면 된다.

 

마스크 형태의 행렬을 조건으로 넣어줄 때, numpy.isin() 뿐만 아니라 numpy.where()가 사용될 수도 있다. 괄호 안에 입력변수로 조건만 넣어주면 참/거짓 으로 구멍뚫린 모양자 행렬을 반환하게 된다. 

 

 

 

 

반응형