-
파이썬 데이터사이언스 핸드북 2 장 - NumPy 배열의 기본 기능데이터 분석/NumPy 2020. 5. 16. 12:49
기본 배열 조작 기능 목차
배열 속성 지정: 배열의 크기, 모양, 메모리 소비량, 데이터 타입을 결정
배열 인덱싱: 개별 배열 요솟값을 가져오고 설정
배열 슬라이싱: 큰 배열 내에 있는 작은 하위 배열을 가져오고 설정
배열 재구조화: 해당 배열의 형상을 변경
배열 결합 및 분할: 여러 배열을 하나로 결합하고 하나의 배열을 여러 개로 분할
배열의 기본 속성들
ndim (차원의 개수), shape (각 차원의 크기), size (전체 배열의 크기)
dtype (배열의 데이터 타입), 각 배열 요소의 크기 (itemsize), 배열의 전체 크기 (nbytes)
차원의 갯수는 [ ] 의 숫자이다.
shape 속성으로 반환된 tuple 의 각 값은 tuple 인덱스 순서대로 각 차원이 가지고 있는 요소의 갯수이다.
(3,4,5) 의 경우, 3개의 차원이고, 1차원에 3개 / 2차원에 4개 / 3차원이 5개의 요소가 들어간다.
그리고 size 전체 배열의 크기는 3 x 4 x 5 = 60 , 총 60개이다.
NumPy 배열의 데이터타입 [링크]
int4, int8 와 같이 한 요소가 가지게 되는 메모리 크기를 제한하여, 메로리를 효율적으로 사용할 수 있다. *빅 엔디언이나 리틀 엔디언 숫자처럼 고급 타입을 지정하는 것도 가능하다. NumPy 는 복합 데이터 타입 (compound data type) -배열 단위가 아니라 요소 단위로 데이터타입- 을 지정할 수 있도록 한다.
https://www.w3schools.com/python/numpy_data_types.asp
*빅 엔디언 & 리틀 엔디언 에 대해 잘 소개된 글: https://ahnjg.tistory.com/37
엔디언은 컴퓨터의 메모리와 같은 1차원의 공간에 여러 개의 연속된 대상을 배열하는 방법을 뜻한다. 바이트 순서에 따라 빅 엔디언과 리틀 엔디언을 나눌 수 있다. 빅 엔디언은 사람이 숫자를 쓰는 방법과 같이 큰 단위의 바이트가 앞에 오는 방법이고, 리틀 엔디언은 반대로 작은 단위의 바이트가 앞에 오는 방법이다. 빅 엔디언은 사람이 숫자를 쓰는 순서를 따르니 디버깅이 편하고, 리틀 엔디언은 작은 숫자일 때 앞에 있는 값만 읽고 처리하면 되어서 효율적이다. 하지만 컴퓨팅이 발달한 지금은 두 방식의 차이가 의미없어지고 있다고 한다...ㅎ
배열 인덱싱: 단일 요소에 접근하기
[ 를 만날 때 마다, 찾아갈 요소의 위치를 적어주면 된다.
x2 는 ( 2, 3 ) 형태로 2차원 배열이고, 한 차원에 3개의 값이 들어있다.
배열 슬라이싱: 하위 배열에 접근하기
: 기호로 표시되는 슬라이스(slice) 표기법으로 하위 배열에 접근할 수 있다.
x [ start : stop : step]
- start 인덱스부터 (stop-1) 인덱스의 값까지
- start, star+1step, start+2step 과 같이 step 간격의 요소를 추출해라
- step 은 생략가능하다. 즉, x[5:] 로 : 가 하나만 있으면 start:end 만 표시하는 것이다.
- default값: start = 0, stop = 차원크기, step = 1 (처음부터 끝까지 모든 요소 추출)
[ ] 의 갯수가 차원의 크기이다.
1번째 차원 [ ] 안에 포함된 element는 총 3개이다: [3,5,2,4], [7,6,8,8], [1,6,7,10]
2번째 차원의 [ ] 안에 포함된 element 는 총 4개이다: [3,5,2,4] element 안의 element 3,5,2,4
사본이 아닌 뷰로서의 하위 배열
배열 슬라이스는 배열 데이터의 사본(copy)가 아니라 뷰(view) 를 반환한다. (파이썬 리스트의 슬라이스는 사본이지만)
배열의 사본 만들기
배열이나 하위 배열 내의 데이터를 명시적으로 복사하고 싶을 경우 copy() 메소드를 사용한다.
x2_sub_copy = x2 [:2, :2].copy()
배열 재구조화
배열의 reshape() 도 배열 데이터의 사본(copy)가 아니라 뷰(view) 를 반환한다.
a.reshpae(newShape_tuple or -1)
배열 연결
여러 배열을 하나로 결합하거나, 반대로 하나의 배열을 여러 개의 배열로 분할하는 것도 가능하다. np.concatenate, np.vstack, np.hstack
배열간 연결 연산한다. axis 옵션을 통해 어느 차원에서 연산할 지를 지정해준다. 연산 대상이 되는 차원 내 요소의 크기가 같아야 한다.
axis = 0 1차원에서 연산하려고 했는데, 각 배열의 1차원 내 요소의 크기가 달라서 연결 실패했다!
vstack (Vertical Stack) 은 1차원 단위의 내부 요소를 연결하였다. [1,2,3], [4,5,6], [7,8,9] 요소 나열
hstack (Horizontal Stack) 은 동일한 차원을 전제한 상태에서, 뒤에 요소만 연결하였다. [9,8,7, 그리고 99]
배열 분할
결합의 반대는 분할로, np.split, np.hsplit, np.vsplit 함수로 구현된다. 각 함수에 분할 지점을 알려주는 인덱스 목록을 전달할 수 있다.
np.split(분할대상, [분할위치1, 분할위치2, ...]
N 개의 분할점은 N+1 개의 하위 배열을 만든다.
np.vsplit|hsplit(분할대상, [분할위치1, 분할위치2...])
split 방식을 지정하여 vsplit, hsplit 을 활용할 수도 있다. vsplit 은 수직으로 / hsplit 은 수평으로 분할한다.
왠지 엑셀파일에서 동일한 데이터셋에 대해 행으로 분할하는 것과 동일한 개념이다.
엑셀파일에서 필요한 컬럼만 분할하여 추출하는 것과 동일한 개념!
np.dstack, np.dsplit 은 세번째 축을 따라 배열을 분할한다고 하는데... 일단 이건 너무 복잡하니까 스킵하고 필요할 때 공부해야겠다 ;ㅁ;ㅎ (기본 기능들 양이 좀 많아서 지쳤으니)
이 포스트에서 소개하는 연산 유형이 다소 무미건조하고 현학적인 것 처럼 보일 수 있지만, 이 책에 사용된 다른 많은 예제의 기초가 되니 잘 알아두자!
라고 책에 언급되어있었으니, 그래도 잘 따라온 나에게 칭찬 ㅇ__ㅇ. 동작방식이 추가적으로 궁금한건 추가실험코드를 작성해서 기초 탄탄하게 공부했다. 뿌듯.
'데이터 분석 > NumPy' 카테고리의 다른 글
파이썬 데이터사이언스 핸드북 2 장 - NumPy 지수와 로그 함수 (0) 2020.05.23 파이썬 데이터사이언스 핸드북 2 장 - NumPy 배열연산 ufuncs 소개 (0) 2020.05.17 파이썬 데이터사이언스 핸드북 2 장 - ndarray 소개 (0) 2020.05.16 파이썬 데이터사이언스 핸드북 2장 - Numpy 소개 (0) 2020.05.12 파이썬 데이터사이언스 핸드북 1장 - 코드 프로파일링 및 시간 측정 (0) 2020.05.09