Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python NumPy 실수 배열에서 정수 제거하기 – 필터링 방법 2가지

데이터 정제(data cleansing) 작업을 하다 보면 배열에서 정수를 걸러내고 실수(float) 값만 남겨야 하는 경우가 종종 있습니다. 이 글에서는 정수와 실수가 섞여 있는 NumPy 배열에서 정수를 제거하고 실수만 추출하는 두 가지 방법을 예제 코드와 함께 소개합니다.

방법 1: astype 함수 활용

astype 함수는 배열의 각 요소를 정수형(int)으로 변환하는 기능을 합니다. 이를 활용해 원래 값과 정수로 변환한 값을 비교하면, 해당 요소가 정수인지 아닌지 판별할 수 있습니다. 변환 전후 값이 다르면 소수 부분을 가진 실수이므로 결과 배열에 남기고, 같으면 정수이므로 제거하는 방식입니다.

예제

import numpy as np

# 배열 초기화
A_array = np.array([3.2, 5.5, 2.0, 4.1, 5])

print("주어진 배열 :\n ", A_array)

# 정수 필터링
res = A_array[A_array != A_array.astype(int)]

# 결과 출력
print("정수가 제거된 배열:\n", res)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

Given array :
    [3.2 5.5 2. 4.1 5. ]
Array without integers:
    [3.2 5.5 4.1]

방법 2: equal과 mod 함수 활용

두 번째 방법은 배열의 각 요소에 대해 1로 나눈 나머지(mod)를 구하는 것입니다. 어떤 수를 1로 나눈 나머지가 0이라면 그 수는 정수이고, 0이 아니라면 소수 부분을 가진 실수입니다. np.equal로 나머지가 0인지 확인한 뒤 ~ 연산자로 조건을 뒤집어, 나머지가 0이 아닌 요소(즉 실수)만 결과에 남깁니다.

예제

import numpy as np

# 배열 초기화
A_array = np.array([3.2, 5.5, 2.0, 4.1, 5])

print("주어진 배열 :\n ", A_array)

# 정수 필터링
res = A_array[~np.equal(np.mod(A_array, 1), 0)]

# 결과 출력
print("정수가 제거된 배열:\n", res)

실행 결과

위 코드를 실행하면 첫 번째 방법과 동일한 결과를 얻습니다.

Given array :
    [3.2 5.5 2. 4.1 5. ]
Array without integers:
    [3.2 5.5 4.1]

두 방법의 비교 및 참고 사항

astype 방식은 코드가 직관적이라 이해하기 쉽지만, 배열 전체를 정수형으로 새로 변환하는 과정에서 추가 메모리가 필요할 수 있습니다. 반면 mod 방식은 형변환 없이 나머지 연산만 수행하므로 대용량 배열에서도 효율적으로 동작하는 장점이 있습니다. 다만 NaN이나 무한대(inf)처럼 특수한 값이 포함된 배열에서는 결과가 예상과 다를 수 있으므로, 데이터의 특성에 맞는 방법을 선택하는 것이 좋습니다.