본문 바로가기

데이터분석

[Python] 조건에 해당하는 array 값 변경

dataframe 보다 numpy 배열이 훨씬 빠르기도 하고, 딥러닝 모델의 input을 위해 array로 변환하여 처리해야 하는 일이 많다. 데이터프레임에서 조건에 맞는 행을 필터링해서 값을 변경하는 것처럼 numpy 배열에서도 조건에 맞는 원소를 변경하려면 어떻게 해야 할까? 

1) np.where 절로 조건에 해당하는 인덱스를 가져오기

# 예시로 사용할 배열 생성
arr = np.array([[0.1, 0.6, 0.3, 0.8, 0.2],
                 [0.7, 0.4, 0.9, 0.2, 0.5],
                 [0.3, 0.2, 0.6, 0.7, 0.1],
                 [0.8, 0.1, 0.5, 0.4, 0.9]])

# 2번 열과 4번 열에서 0.5를 초과하는 값의 인덱스 가져오기
indices = np.where(arr[:, [2, 4]] > 0.5)

>>> indices
(array([1, 2, 3]), array([0, 0, 1]))

2차원 배열이다 보니 가져오는 인덱스 값이 튜플형태로 되어 있다. 

indices 에서 첫번째 요소는 조건을 만족하는 행 인덱스를 의미하며, 두번째 요소는 조건을 만족하는 열 인덱스를 의미한다. 

즉, 배열에서 1행의 0번째 열(2,4열 중 0번째=2열)인 arr[1,2]의 데이터인 0.9,
배열에서 2행의 0번째 열인 arr[2,2]의 데이터인 0.6, 
배열에서 3행의 1번째 열(4열)인 arr[3,4] 데이터인 0.9를 의미한다. 

2) 인덱스에 해당하는 각 원소를 원하는 값으로 변경  

# 인덱스에 해당하는 각 원소를 0으로 설정
for i in range(len(indices[0])):
    arr[indices[0][i], [2, 4][indices[1][i]]] = 0

print(arr)
>>> arr
array([[0.1, 0.6, 0.3, 0.8, 0.2],
       [0.7, 0.4, 0. , 0.2, 0.5],
       [0.3, 0.2, 0. , 0.7, 0.1],
       [0.8, 0.1, 0.5, 0.4, 0. ]])

각 인덱스에 해당하는 원소를 튜플형태기 때문에 각각 인덱싱하여 원하는 값인 0으로 for문으로 반복하여 변경해주면 
결과가 위와 같이 각 인덱스에 0으로 변경된 것을 확인할 수 있다.