[데이터분석] Numpy배열 - indexing, slicing

2024. 8. 13. 15:42데이터 사이언스

Indexing

  • 여러 원소를 가지고 있는 개체(리스트, 튜플, 배열 등)에 부여되는 번호
  • 파이썬의 List와 동일하게 ndarray도 인덱싱 가능

 

# 1부터 10까지 수 중 랜덤하게 6개의 수가 추출된 'arr1'이라는 배열
# shape: 3X2인 2차원 배열
arr1 = np.random.randint(1, 11, size = (3, 2))

print(arr1[0,:]) # 1행 출력
print(arr1[1, 0]) # 2행 1열의 원소 출력

 


Slicing

  • 여러 원소를 가지고 있는 객체의 일부를 추출하는 것
  • 파이썬의 List와 동일하게 ndarray도 슬라이싱 가능

1. 1차원 배열의 슬라이싱

 

# 10부터 19까지 연속적인 수로 이루어진 'arr2'라는 배열
# shape: 1차원 배열
arr2 = np.arange(10, 20)
print(arr2)

print(arr2[4:7]) # index가 4~6인 원소 출력
print(arr2[6:]) # index가 6 이상인 원소 출력

arr2[6:]=20 # index가 6 이상인 원소를 모두 20으로 바꾸기
print(arr2)

 

 

2. 다차원 배열의 슬라이싱

# 1부터 9까지 연속적인 수로 이루어진 'arr3'라는 배열
# shape: 3X3인 2차원 배열
arr3 = np.arange(1, 10).reshape(3, 3)
print(arr3)

# 2, 3, 5, 6으로 구성된 2차원 배열 출력
print(arr3[:2, 1:])
# :a 0~(a-1)행까지 출력
# a: a열부터 출력 (0행,0열 시작 가정)

# 1행 출력
print(arr3[0])
print(arr3[0, :])

# 2행 출력
print(arr3[1])
print(arr3[1, :])
# print(arr3[a, :a]) # a행, 0~(a-1)행까지 출력 (0행,0열부터 시작 가정)

# 2열 출력
print(arr3[:, 1])

 

 

2-1 결측치(NaN)

arr3 = np.arange(1, 10).reshape(3, 3)
print(arr3)

# 2, 3, 5, 6을 모두 결측치로 바꾸기
# 결측치: 데이터에 값이 없는 것 (NaN, null, None)
arr3[:2, 1:] = np.nan
print(arr3)
  • 오류발생 → numpy에서 자료형이 float일 때만 결측치 삽입 가능

 

  • float 타입으로 변환 후 결측치 삽입 

 

# numpy에서 자료형이 float일 때만 결측치 삽입 가능
arr3 = arr3.astype(float)
arr3[:2, 1:] = np.nan
print(arr3)

마스킹 연산(boolean 인덱싱)

  • 마스킹 연산: 조건에 부합하는 데이터만 추출하는 방법

# 난수가 표준정규분포 따르는 'arr4'라는 배열 생성
# shape: 5X5인 2차원 배열
arr4 = np.random.randn(5, 5)
print(arr4)

# arr4 안의 원소가 양수이면 True, 음수이면 False 출력
print(arr4>0)

# arr4 안의 원소가 음수면 0 삽입
arr4 = np.where(arr4 > 0, arr4, 0) # 0은 broadcasting 되었음
print(arr4)