[데이터 분석] Numpy의 ndarray 객체와 자주 사용하는 메서드
ndarray: n차원(Dimension) 배열(Array) 객체
1차원 배열: [1,2,3,4]
2차원 배열: 1차원의 요소가 여러개 있는 형태 [[1,2,3,4][1,2,3,4]]
3차원 배열: 2차원 배열이 많으면 3차원 배열
ndarray 생성
Numpy 모듈의 array()로 함수 생성
인자로 주로 파이썬 list 또는 ndarray 입력
import numpy as np
array1 = np.array([1,2,3])
array2 = np.array([[1,2,3],[2,3,4]])
##
array1 = [1,2,3] -> 2D Array
array2 = [[1,2,3], [2,3,4]]
ndarray 형태와 차원
array 차원 shape
array = [1,2,3] | 1 | array.shape = (3,) |
array = [[1,2,3],[2,3,4]] | 2 | array.shape = (2,3) |
ndarray의 shape는 ndarray.shape의 속성으로, 차원은 ndarray.ndim으로 알 수 있다
단 shape의 튜플 요소가 몇개 있느냐에 따라 차원을 알 수 있다
ndarray 타입
문자형은 숫자, 문자열, 불 값 등 모두 가능
데이터 타입은 그 연산의 특성 상 같은 데이터 타입만 가능하다
즉, 한 개의 ndarray 객체에 int와 float이 함께 있을 수 없다
ndarray의 타입은 ndarray.dtype으로 확인 가능
ndarray 타입 변환
astype()을 이용하여 변환
변경을 원하는 타입을 astype()에 인자로 입력
array1d = [1.0, 2.0]
array = array1d.astype("int32") or (np.int32)
메모리를 절약하기 위해 사용
64비트의 float 보단 integer가 메모리가 작음
넘파이 ndarray의 axis 축
ndarray는 shape는 행, 열, 높이 단위로 부여되는게 아니라 axis0,axis1,axis2와 같이 axis가 부여된다
[1,2,3] → axis0 → (3,)
[[1,2,3],[2,3,4]] → (axis0, axis1) → (2,3)
[[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]] → (axis2, axis1, axis0) → (2,2,3)
ndarray 를 편리하게 생성하기 - arange, zeros, ones
np.arange(10) → [01.2.3.4.5.6,7,8,9]
np.zeros((3,2),dtype=’int32’) → [[0,0],[0,0],[0,0]] //default는 float64 일단은 shape을 알 때 사용하는 함수
np.ones((3,2)) → [[1,1],[1,1],[1,1]]
ndarray의 차원과 크기를 변경하는 reshape()
array1 = np.arange(10)
reshape(2,5) → 2X5의 ndarray로 변환됨 → [[0,1,2,3,4],[5,6,7,8,9]]
reshape(-1,5)와 같이 인자에 -1을 부여하면 -1에 해당하는 axis의 크기는 가변적이되 -1이 아닌 인자값에 해당하는 axis 크기는 인자값으로 고정하여 ndarray의 shape을 고정한다
만약 인자 값이 적절히 배열을 나눌 수 없는 값이면 에러가 발생한다
reshape()는 reshape(-1,1) or reshape(-1,)와 같은 형태로 나오면 아래와 같이 사용된다
[1,2,3,4].reshape(-1,1) → [[0],[1],[2]…]
[[1],[2],[3],[4]].reshape(-1,) #1차원으로 변환 → [1,2,3,4]
ndarray의 데이터 세트 선택하기: indexing
인덱싱 유형 설명
특정 위치의 단일 값 추출 | 원하는 위치의 인덱스 값을 지정하면 해당 위치의 데이터가 반환됨 |
슬라이싱 | 슬라이싱은 연속된 인덱스상의 ndarray를 추출하는 방식임 |
’:’ 사이에 시작 인덱스와 종료 인덱스를 표시하면 인덱스에서 종료 인덱스 -1 위치에 있는 ndarray를 반환함 | |
팬시 인덱싱 | 일정한 인덱싱 집합을 리스트 또는 ndarray형태로 지정해 해당 위치에 있는 ndarray를 반환함 → [0,1,2] → 인덱스임 |
불린 인덱싱 | 특정 조건에 해당하는지 여부인 True/False 값 인덱싱 집합을 기반으로 True에 해당하는 인덱스 위치에 있는 ndarray 반환 |
단일 값 추출 - 1차원 ndarray
array1 = [1,2,3,4,5,6,7,8,9] → 인덱스 값[0,1,2,3,4,5,6,7,8] or [-9,-8,-7,-6,-5,-4,-3,-2,-1]
ndarray 뒤에 대괄호가 오게되면 위치 인덱스를 하겠습니다 라는 뜻 → 리스트 속 값이 아님
단일 값 추출 - 2차원 ndarray
array2d = [[1,2,3],[4,5,6],[7,8,9]] → array2d.shape = (3,3)
array2d[0,0] = 1
array2d[0,1] = 2
array2d[1,0] = 4
array2d[2,2] = 9
슬라이싱 - 1차원 ndarray
array1 = [1,2,3,4,5,6,7,8,9]
array1[0:3] = [1,2,3]
array1[:3] = [1,2,3] ## 콜론 앞이 없으면 무조건 0
array[3:] = [4,5,6,7,8,9] ##콜론 뒤가 없으면 무조건 끝
슬라이싱 - 2차원 ndarray
array2d = [[1,2,3],[4,5,6],[7,8,9]] → array2d.shape = (3,3)
array2d[0:2, 0:2] = [[1,2],[4,5]]
array2d[1:3, 0:3] = [[4,5,6],7,8,9]]
array2d[:2,1:] = [[2,3],[5,6]]
array2d[:2,0] = [1,4]
팬시 인덱싱 - 1차원 ndarray
슬라이싱 인덱싱은 연속된 인덱스만 가능했으나 팬시 인덱싱은 원하는 인덱스 값을 리스트 형태로 전달하여 인덱싱이 가능함
array1 = [1,2,3,4,5,6,7,8,9]
array1[[2,4,7]] = [3,5,8]
팬시 인덱싱 - 2차원 ndarray
array2d = [[1,2,3],[4,5,6],[7,8,9]] → array2d.shape = (3,3)
array2d[[0,1],2] = [3,6]
array2d[[0,1],[0,1]] = [[1,2],[4,5]]
array2d[[0,1]] = [[1,2,3],[4,5,6]] //뒤에 추가 인자가 없으면 axis 0으로 인지해라
불린 인덱싱
불린 인덱싱은 조건 필터링과 추출을 동시에 하기 때문에 자주 사용된다
array1d = np.arange(start=0, stop=10) -> 기본 매개변수는 값 시작점과 끝점
array1d[array1d>5] -> 대괄호 안에 조건이 들어가면 자동으로 불린 인덱싱이라 인지함
조건식 안에 들어간 조건을 수행 → 불린 형태로 반환이 됨
이 결과의 type과 shape
따로 불린 ndarray를 만들어서 불린 인덱싱을 실행 했을 때 결과
불린 인덱싱이란 어떤한 조건식을 집어넣으면 조건식이 불린 값을 가진 ndarray 값으로 반환되어 True에 해당하는 인덱스의 값만 조회되는 인덱싱
배열의 정렬 - sort(), argsort()
np.sort(): 인자로 원 행렬은 그대로 유지한 채 원 행렬의 정렬된 행렬을 반환 - 원본 유지
ndarray.sort: 원 행렬 자체를 정렬한 형태로 변환하며 반환 값 없음 - 원본 파괴
기본적으로 오름차순으로 행렬 내 원소 정렬
내림차순으로 정렬하기 위해선 [::-1]을 적용함
np.sort()[::-1]처럼 사용하면 됨
2차원 배열에서 axis 기반의 sort()
array = [[8,12],[7,1]]
np.sort(array. axis0) → [[7,1],[8,12]] → axis0 방향으로 정렬
np.sort(array, axis1) → [[8,12],[1,7]] → axis1 방향으로 정렬
argsort()
원본 행렬 인덱스에 대해 오름차순으로 값 정렬 후 바뀐 원본 행렬 인덱스의 위치를 반환
[3,1,9,5] → np.argsort() → [1,3,5,9]
[0,1,2,3] → np.argsort() → [1,0,3,2] → 이 값 반환
argsort()도 뒤에 [::-1]을 붙이면 내림차순으로 원본 행렬 인덱스 값을 리턴 받아볼 수 있다
넘파이의 경우 파이썬 딕셔너리처럼 key:value 형태로 매핑이 어렵다보니 다른 값으로 임의의 매핑을 하는 경우가 많다. 아래는 점수와 이름을 키와 value로 매핑을 하고 점수를 argsort()로 정렬하여 원본 행렬 인덱스 값을 추출해 이를 팬시 인덱싱을 활용하여 해당 점수를 가지고 있던 인물의 이름을 조회하는 코드이다
선형대수 연산 - 행렬 내적
np.dot(A,B) → A, B는 각각의 행렬
선형대수 연산 - 전치 행렬
np.transpose(A)- 행과 열을 서로 바꾸는 것 → 행을 열로, 열을 행으로
위 행렬의 shape = (2,2) → (2,2)
위 행렬의 shape = (3,2) → (2,2)
학습 자료 출처: https://github.com/chulminkw/PerfectGuide
GitHub - chulminkw/PerfectGuide
Contribute to chulminkw/PerfectGuide development by creating an account on GitHub.
github.com