Prev Contents/Wrangling

[파이썬 라이브러리를 활용한 데이터 분석] 6~8일차 (133~180p)

Convergence Medicine 2022. 6. 18. 09:53

4. NumPy 기본: 배열과 벡터 연산

6~8일차 (2020-06-16/17/18)도 이 책으로 시작:

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9791162241905&orderClick=LEa&Kc=

 

파이썬 라이브러리를 활용한 데이터 분석 - 교보문고

영화 평점, 이름통계, 선거 데이터 등 실사례 사용 | ★ 『파이썬 라이브러리를 활용한 데이터 분석』 드디어 개정!이 책의 초판이 출간된 2012년은 pandas 개발 초기로, 파이썬용 오픈소스 데이터

www.kyobobook.co.kr

아래의 요약은 책을 충실히 요약한 것이 아닌 오늘 공부한 것의 정리일 뿐입니다.
저자의 코드 예제 github repository: http://github.com/wesm/pydata-book
자세한 내용 책을 사서 보시거나 영문판의 경우 저자의 홈페이지에 3판의 open edition이 있습니다 (https://wesmckinney.com/book/).

 

GitHub - wesm/pydata-book: Materials and IPython notebooks for "Python for Data Analysis" by Wes McKinney, published by O'Reilly

Materials and IPython notebooks for "Python for Data Analysis" by Wes McKinney, published by O'Reilly Media - GitHub - wesm/pydata-book: Materials and IPython notebooks for "Pyth...

github.com

 

Python for Data Analysis, 3E

About the Open Edition The upcoming 3rd edition of Python for Data Analysis is available as an “Open Access” HTML version on this site https://wesmckinney.com/book in addition to the usual print and e-book formats. This is currently an Early Release ve

wesmckinney.com

독자에게 전하는 조언:

1) 데이터 분석을 생산적으로 하기 위해 파이썬으로 훌륭한 소프트웨어를 개발할 수 있을 정도로 파이썬 고수가 되어야 할 필요는 없다고 생각한다.
2) Numpy의 깊은 이해가 필수 사항은 아니며, 배열 위주의 프로그래밍과 생각하는 방법에 능숙해지는 것이 과학 계산의 고수가 되는 지름길이다.

들어가기 전

Keyword:

  • 다차원 배열인 ndarray 빠른 배열 계산 & 브로드캐스팅 기능
  • 표준 수학 함수
  • 디스크에 쓰거나 읽을 수 있는 도구
  • 선형대수, 난수 생성기, 푸리에 변환 기능
  • C API - C, C++, 포트란으로 작성한 코드를 연결

대용량 데이터 배열을 효율적으로 다룰 수 있도록 설계:

  • 데이터를 다른 내장 파이썬 객체와 구분된 연속된 메모리 블록에 저장
  • 또한 내장 파이썬의 연속된 자료형보다 훨씬 더 적은 메모리를 사용
  • 파이썬 반복문을 사용하지 않고 전체 배열에 대한 복잡한 계산을 사용

4.1 Numpy ndarray: 다차원 배열 객체

ndarray라고 하는 $N$차원의 배열 객체 - 대규모 데이터 집합을 담을 수 있는 빠르고 유연한 자료구조다.
배열은 스칼라 원소 간의 연산에 사용하는 문법과 비슷한 방식을 사용, 전체 데이터 블록에 수학적인 연산을 수행할 수 있도록 함
ndarray의 모든 원소는 같은 자료형이어야 한다.
각 차원을 알려주는 shape 튜플, 저장된 자료형을 알려주는 dtype 객체가 있다.

4.1.1 ndarray 생성하기

배열을 생성하는 가장 쉬운 방법 - np.array() 함수
리스트 내 리스트의 원소 수가 같다면 np.array() 함수에서 해당 데이터로부터 형태를 추론하여 2차원 형태로 재구성해 준다.
ndim 속성, shape 속성으로 확인
dtype을 명시하지 않으면 float64이다.

다차원 배열을 생성하려면 원하는 형태의 튜플을 전달하면 된다.

 

대표적인 배열 생성 함수:
np.zeros() - 주어진 dtype과 모양을 가지는 배열을 생성하고 내용을 모두 0으로 초기화
np.ones() - 상동이나 내용을 모두 1로 초기화
np.empty() - 초기화되지 않은 '가비지' 값으로 채워진 배열을 반환
np.arange() - 내장 함수인 range() 함수의 배열 버전

4.1.2 ndarraydtype

dtype은 ndarray가 메모리에 있는 특정 데이터를 해석하기 위해 필요한 정보 (메타데이터)를 담고 있는 특수한 객체다.
dtype은 자료형의 이름과 하나의 원소가 차지하는 비트 수로 이루어진다. 예를 들어) float64 - 표준 배정밀도 부동소수점은 64비트로 이루어져 있다.
astype() 메서드로 배열의 dtype을 다른 형으로 명시적으로 변환 가능하다.
Caution 문자열 데이터 (np.string_)는 별다른 경고 없이 입력을 임의로 잘라낼 수 있으므로 주의

4.1.3 Numpy 배열의 산술 연산

벡터화 - 같은 크기의 배열 간의 산술 연산은 배열의 각 원소 단위로 적용된다.
스칼라 연산은 배열 내의 모든 원소에 스칼라 인자가 적용된다.
비교 연산은 불리언 배열을 반환한다.

4.1.4 색인과 슬라이싱 기초

배열 조각에 스칼라값을 대입하면 브로드캐스팅되어 선택 영역 전체에 반영된다.
복사되는 것이 아니라, 뷰에 대한 변경이 그대로 원본 배열에 반영된다.
복사본을 얻고 싶다면 copy() 메서드를 사용
2차원 배열에서 재귀적인 방법과 콤마로 구분된 색인 리스트를 넘기던가

슬라이스로 선택하기

슬라이스는 축을 따라 선택 영역 내의 요소를 선택한다.
색인을 여러 개 넘겨서 다차원을 슬라이싱 하는 것도 가능
정수 색인과 슬라이스를 함께 사용해서 한 차원 낮은 슬라이스를 얻을 수 있다.

4.1.5 불리언값으로 선택하기

numpy.random 모듈의 randn() 함수
배열에 대한 비교 연산도 벡터화됨
Caution 불리언 값으로 배열을 선택할 때 불리언 배열의 크기가 다르더라도 실패하지 않으니 주의
!=~를 사용하여 조건절 부인
&|를 사용하여 두 가지 이름을 선택
반환되는 배열 내용이 바뀌지 않아도 항상 데이터 복사가 발생
Caution 불리언 배열에서 파이썬 예약어인 andor는 사용할 수 없다.
쉽게 사용할 수 있지만 2차원 데이터에 대한 연산은 pandas를 이용해서 처리하는 것이 편리함

4.1.6 팬시 색인

정수 배열을 사용한 색인

원하는 순서가 명시된 정수가 담긴 ndarray나
리스트를 넘기면 된다.

 

음수를 사용하면 끝에서부터 로우를 선택
다차원 색인 배열은 각각의 색인 튜플에 대응하는 1차원 배열이 선택된다.
Refer reshape() 메서드 - 부록 A.2.1 참조
즉, 배열이 몇 차원이던지 팬시 색인의 결과는 항상 1차원이다.
슬라이싱과 달리 선택된 데이터를 새로운 배열로 복사

4.1.7 배열 전치와 축 바꾸기

배열 전치는 데이터를 복사하지 않고 데이터의 모양이 바뀐 뷰를 변환 - transpose() 메서드, T 속성
다차원 배열의 경우 튜플로 축 번호를 받아서 치환
swapaxes() 메서드 - 두 개의 축 번호를 받아서 서로의 배열을 뒤바꾼다.

4.2 유니버셜 함수: 배열의 각 원소를 빠르게 처리하는 함수

ufunc - ndarray 안에 있는 데이터 원소별로 연산을 수행
예를 들어 sqrt(), exp() 같은 함수는 하나 이상의 스칼라 값을 입력으로 받아서 하나 이상의 스칼라 값을 출력으로 반환
2개의 인자를 취해서 단일 배열을 반환하는 이항 유니버셜 함수 - 예를 들어, add(), maximum()
여러 개의 배열을 반환 - modf() 함수는 분수를 받아서 몫과 나머지를 함께 반환
out 인자를 전달하여 계산 결과를 따로 저장할 수 있다.

4.3 배열을 이용한 배열지향 프로그래밍

Numpy 배열을 이용하면 반복문을 작성하지 않고 간결한 배열 연산을 사용 - 벡터화
Refer 브로드캐스팅 부록 A.3을 보자

np.meshgrid() 함수 - 두 개의 1차원 배열을 받아서 가능한 모든 (x, y) 짝을 만들 수 있는 2차원 배열 두 개를 반환

4.3.1 배열 연산으로 조건절 표현하기

np.where() - 삼항식의 벡터화된 버전이다.
삼항식은 큰 배열을 빠르게 처리하지 못한다. 또한, 다차원 배열에서 사용할 수 없다.
두 번째와 세 번째 인자는 배열이 아니어도 상관 없다 (둘 중 하나 둘 다 스칼라여도 된다.)

4.3.2 수학 메서드와 통계 메서드

선택적으로 axis 인자를 받아서 해당 axis에 대한 통계를 계산하고 한 차수 낮은 배열을 반환
cumsum(), cumprod() 같은 경우는 같은 크기의 배열을 반환 - 축 지정 시에는 한 차수 낮은 배열

4.3.3 불리언 배열을 위한 메서드

sum() 메서드로 불리언 배열에서 True인 원소의 개수를 셀 수 있다.
any(), all() 메서드

4.3.4 정렬

sort() 메서드 - 넘긴 축의 값에 따라 1차원 부분을 정렬
정렬된 결과를 가지고 있는 복사본을 반환
정렬 후 특정 분위의 값을 선택할 수 있다.
Refer 부록 A.6 참조

4.3.5 집합 관련 함수

배열 내에서 중복된 원소를 제거하고 남은 원소를 정렬된 형태로 반환 - np.unique() 함수
두 개의 배열을 인자로 첫 번째 배열의 원소가 두 번째 배열의 원소를 포함하는지 불리언 배열을 반환 - np.in1d() 함수

4.4 배열 데이터의 파일 입출력

np.save(), np.load() - 배열 데이터의 저장 및 불러 오기: *.npy 파일로 저장
np.savez() - 여러 개의 배열을 압축된 형식으로 저장: *.npz 파일로 저장
압축이 잘 되는 형식의 데이터 - np.savez_compressed()를 사용

4.5 선형 대수

* 연산자 - 각각의 원소의 곱을 계산
dot() 함수 - 행렬 곱셈
동의어 - np.dot(x, y), @
numpy.linalg - 행렬의 분할, 역행렬, 행렬식과 같은 선형 대수 계산 모듈

4.6 난수 생성

numpy.random 모듈 - 내장 모듈보다 수십 배 이상 빠르다.
유사 난수라고 부르는데, 난수 생성기의 시드값에 따라 정해진 나수를 알고리즘으로 생성 이를, np.random.seed를 이용해서 변경
numpy.random.RandomState를 이용해서 격리된 난수 생성기를 만들 수 있다.

4.7 계단 오르기 예제

계단 오르 내리기를 1000 걸음 해보기
np.abs()
np.argmax() - 불리언 배열에서 최대값의 처음 색인을 반환, 배열 전체를 모두 확인하기 때문에 효과적인 방법은 아니다.

4.7.1 한 번에 시뮬레이션하기

계단 오르 내리기 1000 걸음을 5000번 시뮬레이션 해보기 - 의외로 빨리 된다.

4.8 마치며

주로 pandas를 쓰지만 배열 기반 방식도 나온다.

추천이 많은 책은 이유가 있다.

오늘의 흔적