AI/Numpy

비교연산, boolean index, fancy index

LTSGOD 2023. 3. 11. 22:43

Camparisons

 

x = np.array([1,2,3,77,34,-1,34])

x > 30

#array([False, False, False,  True,  True, False,  True])

위처럼 x >30 연산을 하게 되면 numpy에서는 각각의 값을 비교해 boolean array로 반환해준다.

 

 

numpy 배열의 크기가 같을 때는 element간 비교결과를 Boolean array로 반환한다.

import numpy as np

a = np.array([1, 2, 3])
b = np.array([2, 2, 2])

print(a == b) # 출력: [False  True False]
print(a != b) # 출력: [ True False  True]
print(a < b)  # 출력: [ True False False]
print(a > b)  # 출력: [False False  True]
print(a <= b) # 출력: [ True  True False]
print(a >= b) # 출력: [False  True  True]
np.logical_and(a,b) a,b 둘을 and연산한 boolean array 반환
np.logical_or(b,c) a,b 둘을 or연산한 boolean array 반환
np.logical_not(b) not 연산한 boolean array 반환
np.all(a) a중 모두 참이어야 true반환
np.any(a) a중 한개라도 true면 true반환
np.where(a >0, 3 , 2) a>0보다 큰 것은 3으로 채워주고 그렇지 않은 것은 2로 채워주는 array 반환
np.where(a>0) a >0인 index 반환
np.isnan(a) a array의 각각이 Nan이면 true, Nan이 아니면 false 인 array 반환
np.isfinite(a) a array의 값이 finite number이면 true, 아니면 fasle인 array 반환
np.argmax(a) a array내 최댓값이 인덱스 반환
np.argmin(a) a array 내 최솟값의 인덱스 반환(axis 설정가능)

boolean index

 

- 특정 조건에 따른 값을 배열 형태로 추출한다.

 

import numpy as np

# 1부터 9까지의 정수를 갖는 3x3 배열 생성
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 배열 a에서 5보다 큰 요소들만 선택하여 새로운 배열 생성
b = a[a > 5]

print(b) # 출력: [6 7 8 9]

 

위의 코드에서, a > 5는 3x3 boolean 배열을 반환합니다. 이 boolean 배열은 True False 값을 갖는데, 배열 a에서 5보다 큰 요소는 True로, 그 외의 요소는 False로 이루어져 있습니다. 이 boolean 배열을 a에 indexing하면 True인 요소들만 선택되어 새로운 1차원 배열 b가 생성됩니다.

 

import numpy as np

# 0부터 9까지의 정수를 갖는 1차원 배열 생성
a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 배열 a에서 2의 배수인 요소들만 선택하여 새로운 배열 생성
b = a[a % 2 == 0]

print(b) # 출력: [0 2 4 6 8]

위의 코드에서, a % 2 == 0는 1차원 boolean 배열을 반환합니다. 이 boolean 배열은 True False 값을 갖는데, 배열 a에서 2로 나누어 떨어지는 요소는 True로, 그 외의 요소는 False로 이루어져 있습니다. 이 boolean 배열을 a에 indexing하면 True인 요소들만 선택되어 새로운 1차원 배열 b가 생성됩니다.

 

 

fancy index

 

array를 index value로 사용해서 값을 추출할 수 있다.

 

a = np.array([2,4,6,8])
b = np.array([0,0,3,2,1,0])

a[b] #array([2, 2, 8, 6, 4, 2])
a.take(b) #array([2, 2, 8, 6, 4, 2]) a[b]와 동일한 겨로가 출력

b를 인덱스 삼아 a의 요소들을 담은 list를 반환한다.

 

2차원 형태로도 가능하다.

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 행 인덱스가 [0, 2], 열 인덱스가 [1, 2]인 요소들을 선택하여 1차원 배열 생성
b = a[[0, 2], [1, 2]]

print(b) # 출력: [2 9]

위의 코드에서, a[[0, 2], [1, 2]]는 배열 a에서 (0, 1), (2, 2) 위치의 요소들을 선택하여 1차원 배열 b를 생성합니다.