이번 포스팅에서는 배열(array)에서 0보다 작은 수는 0으로 변환하고 나머지는 그대로 두는 여러가지 방법을 소개하겠습니다.
1. List Comprehension with for loop
2. Indexing
3. np.where(condition[, x, y])
4. np.clip(a, a_min, a_max, out=None)
1. List Comprehension: [0 if i < 0 else i for i in a] |
아래처럼 for loop 을 써서 list comprehension 방법을 사용하면 특정 라이브러리의 함수를 사용하지 않아도 0보다 작은 수는 0으로 변환할 수 있습니다. 하지만, for loop 을 돌기 때문에 배열(array)가 커지면 성능이 문제될 수 있습니다. 원래의 배열 a는 그대로 있습니다.
>>> import numpy as np >>> a = np.arange(-5, 5) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) >>> [0 if i < 0 else i for i in a] [0, 0, 0, 0, 0, 0, 1, 2, 3, 4] >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) |
2. Indexing: a[a < 0] = 0 |
아래처럼 indexing을 사용해서 a[a < 0] = 0 처럼 0보다 작은 값이 위치한 곳에 0을 직접 할당할 수 있습니다. 이렇게 하면 원래의 배열 a가 변경됩니다.
>>> a = np.arange(-5, 5) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) >>> a[a < 0] = 0 >>> a array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4])
|
3. np.where() : np.where(a < 0, 0, a) |
np.where(조건, True일 때 값, False일 때 값) 를 사용하면 편리하게 0보다 작은 조건의 위치에 0을 할당할 수 있습니다. 벡터 연산을 하므로 for loop이 돌지 않아서 속도가 매우 빠릅니다. 원래의 배열 a는 변경되지 않고 그대로 있습니다.
>>> a = np.arange(-5, 5) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) >>> np.where(a < 0, 0, a) array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4]) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4])
|
만약 0보다 작은 수는 0으로 변환, 2보다 큰 수는 2로 변환하고 싶다면 아래처럼 np.where() 안에 np.where()를 한번 더 넣어서 써주면 되는데요, 코드가 좀 복잡해보입니다.
>>> a = np.arange(-5, 5) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) >>> >>> np.where(a < 0, 0, np.where(a > 2, 2, a)) array([0, 0, 0, 0, 0, 0, 1, 2, 2, 2])
|
4. np.clip() : np.clip(a, 0, 4, out=a) |
np.clip(배열, 최소값 기준, 최대값 기준) 을 사용하면 최소값과 최대값 조건으로 값을 기준으로 해서, 이 범위 기준을 벗어나는 값에 대해서는 일괄적으로 최소값, 최대값으로 대치해줄 때 매우 편리합니다. 최소값 부분을 0으로 해주었으므로 0보다 작은 값은 모두 0으로 대치되었습니다. 이때 원래의 배열 a는 그대로 있습니다.
>>> a = np.arange(-5, 5) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) >>> np.clip(a, 0, 4) array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4]) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4])
|
np.clip(배열, 최소값 기준, 최대값 기준, out 배열)을 사용해서 out = a 를 추가로 설정해주면 반환되는 값을 배열 a에 저장할 수 있습니다. 배열 a의 0보다 작았던 부분이 모두 0으로 대치되어 a가 변경되었음을 확인할 수 있습니다.
>>> np.clip(a, 0, 4, out=a) array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4]) >>> a array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4])
|
최소값 기준만 적용해서 간단하게 '0'보다 작은 수는 모두 0으로 바꾸는 것은 a.clip(0) 처럼 메소드를 사용해도 됩니다.
>>> a = np.arange(-5, 5) >>> a array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) >>> a.clip(0) array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4])
|
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. ^^