numpy배열의 비교 연산은 항상 bool type 배열을 결과로 반환한다.
broadcasting 비교 연산
- 배열 vs 스칼라값
x = np.array([4,3,2,6,5,8])
x>3
>array([ True, False, False, True, True, True])
배열 x의 각 값마다 스칼라값 3과 비교하여 그 결과인 bool type 값들의 배열을 반환한다.
- 배열의 요소별 비교 연산
y = np.arange(1,7)
x>y
>array([ True, True, False, True, False, True])
배열 x와 y의 index가 같은 값들끼리 비교한다.
이때 비교하는 배열들의 크기가 같지 않으면 ValueError가 발생한다.
all & any
- all( ): 모든 값이 참이면 true, 하나라도 거짓이면 false (like 'and')
- any( ): 모든 값이 거짓이면 false, 하나라도 참이면 true (like 'or')
직접 함수의 인자로 비교 식을 주는 경우
np.all(x>3)
>False
비교식에 method로 활용하는 경우
(x>3).any()
>True
where
- where(비교연산): 조건에 맞는 인덱스 값 반환
x = np.array([4,6,7,2,3])
np.where(x>5)
>(array([1, 2]),)
5보다 큰 값은 6, 7이고 index는 1, 2이므로 반환값은 1열, 2열과 같은 의미다.
2차원 배열은 (array[행], array[열])로 나타나고 다음과 같다
a = np.arange(9).reshape(-1, 3)
np.where(a>5)
>(array([2, 2, 2]), array([0, 1, 2]))
5보다 큰값이 2행의 0열, 1열, 2열이므로 위와 같은 결과가 나온다.
- where(비교연산, 참일때 값, 거짓일때 값): 연산결과를 지정 값으로 나타내는 배열반환
np.where(x>5, 1, -1)
>array([-1, 1, 1, -1, -1])
이렇게 index값을 반환하지 않고 비교 연산 후 True값은 10으로, False값은 20으로 표현한다.
argsort & argmax & argmin
정렬된 값의 인덱스 반환
- argsort(배열): 배열 내에 있는 값들을 작은 순서대로 index 반환
- argmax(배열): 배열 내 값들 중 가장 큰 값의 index 반환
- argmin(배열): 배열 내 값들 중 가장 작은 값의 index 반환
arr = np.array([5,-3,4.1,2.12,-9,0],dtype=int)
np.argsort(arr)
>array([4, 1, 5, 3, 2, 0])
위와 같이 argsort는 값을 오름차순 정렬하는 것이 아닌, 오름차순 정렬한 값의 index로 각 값들을 바꾸는 것이다.
bool index & fancy index
- bool index: 추출할 배열에서 특정 배열 조건에 맞는 값 반환
인덱스에 들어가는 배열은 bool type이어야한다.
인덱스에 들어가는 배열의 shape = 추출할 배열의 shape
# bool index
x = np.array([4,2,6,3,7])
condition = x > 3
print(x[condition])
print(x.shape)
print(condition.shape)
>[4 6 7]
(5,)
(5,)
- fancy index: 정수배열 안의 정수 값 = 추출할 배열의 index --> 해당 index에 위치한 값 반환
index 항목에 넣을수 있는 값은 only 정수
정수 값의 범위 <= 추출할 배열의 index 범위
정수 배열의 shape는 추출할 배열의 shape와 같지 않아도 된다.
행렬에서는 '추출할 배열[행 정수배열, 열 정수배열]' 형태로 적용한다. - 추출할 배열.take(정수배열) 과 같은 결과 도출한다.
# fancy index
cond = np.array([4,4,1,1])
x[cond]
>array([7, 7, 2, 2])
아까 배열 x = [4, 2, 6, 3, 7]이었다. 여기서 x[cond]는 배열 x의 [4번째 값, 4번째 값, 1번째 값, 1번째 값]이라는 의미와 같다.
그리고 아래와 같이 take함수를 적용해도 같은 결과가 나온다.
x.take(cond)
>array([7, 7, 2, 2])
fancy index를 2차원 배열에 적용할때는 추출하고자 하는 열의 index값과 추출하고자하는 행의 index값을 가진
각각의 배열들이 준비되어야한다.
a = np.array([[1,4],[9,16]],int)
y = np.array([0,1,0,0,0,1])
x = np.array([0,0,1,1,1,1])
a[y,x]
>array([ 1, 9, 4, 4, 4, 16])
결과 값은 1차원 배열로 반환된다.
'numpy' 카테고리의 다른 글
배열끼리의 연산 (0) | 2022.03.27 |
---|---|
vstack & hstack & concatenate (0) | 2022.03.26 |
배열의 연산 (0) | 2022.03.26 |
identity & eye & diag & 통계분석함수(uniform & normal) (0) | 2022.03.24 |
ones & zeros & empty (0) | 2022.03.24 |