욱이의 냉철한 공부

[Python, 정리] Numpy 사용하기 본문

데이터분석/Python : Basic

[Python, 정리] Numpy 사용하기

냉철한 욱 2022. 3. 28. 07:48

 

 

1 .NumPy, ndarray

- NumPy에는 N차원의 배열 객체인 ndarray가 있고 파이썬에서 사용할 수 있는 대규모 데이터 집합을 담을 수 있는 빠르고 유연한 자료구조이다.

 

- 모든 원소는 같은 자료형

 

 

 

2. NumPy 객체 만드는 방법 및 함수

- import numpy as np : numpy 라이브러리를 호출

 

- data = np.arrange(10) : 파이썬의 range 함수의 배열 버전이다. 리스트 대신 ndarray를 반환한다.

 

- data = [[1,2,3,4],[5,6,7,8]]

arr = np.array[data]

 

- data = np.zeros(10) : 0 반환, 0으로 초기화 하는 것이다. , 누적합 구할 때 자주 사용.

data = np.zeros((3,6))

 

- data = np.empty((2,3,2))

zeros와 다르게 값의 메모리에 이미 값이 있으면 0이 아닌 그 값을 반환한다.

 

- 난수 생성

data = np.random.randn(2,3) : 표준편차 1, 평균 0인 정규분포에서 표본 추출

data = np.random.normal(size=(4,4)) : size는 튜플, 정규분포에서 표본 추출

data = np.random.randint(0,1) : 주어진 최소,최대 범위 안에서 난수 생성

data = np.random.rand(2,3) : 균등분포에서 표본 추출

 

 

 

 

3. NumPy 객체 속성

shape : 각 차원의 크기를 알려줌

 

- data.shape

ndim

dtype : 배열에 저장된 자료형을 알려줌

 

- data.dtype

size

T

 

 

 

4. NumPy 배열 원소 접근 방법 : 뷰로 생성됨

1) Indexing

- 여러 개의 데이터들의 집합인 뭉탱이에서 색인(요소들을 지칭하는 것)하는 것이다.

- arr[5]

- arr[0][2]

- arr[0,2]

 

2) Slicing

- 부분범위를 지정하는 것이다.

 

- arr_slice = arr[5:8]

 

- 리스트와의 차이점은 배열조각이 원본 배열의 뷰라는 점이다. 뷰에 대한 변경은 원본 배열에 반영한다.

이유 : 대용량 데이터 처리를 염두에 두고 설계되었기 때문에 데이터 복사를 남발한다면 성능과 메모리 문제에 직면할 것이다.

arr_slice[1] = 12345

arr 결과값 : array([0,1,2,3,4,12,12345,12,8,9])

 

- arr.copy() 함수 사용하면 원본값 유지 할 수 있다.

 

- 축(axis)이란? : 차원의 개수

벡터는 1차원 배열이기 때문에 축이 1개이면 차원도 1개이다.

[1,2,3,4,5,6,7] -> axis = 0

슬라이싱의 첫번째 기준은 0번축이다.

arr2d[:2], arr2d[:2, 1:] -> 결과값은 2차원배열. 첫번째 기준은 0번축

arr2d[1,:2] -> 결과값은 1차원 배열

 

* Boolean Indexing

- true, false를 통해 인덱싱, 슬라이싱 할 수 있다.

 

- 반복기능을 통해 비교해야 하지만 array 같은 경우는 가능하다.

names = ['bob','job','will','bob'] : 리스트

names == 'bob' -> for 문을 돌려야 비교가능하다.

np.array(names)

names == 'bob' -> 한 번에 비교 가능하다.

 

- 스칼라는 0 아닌 값은 전부 True이다.

 

- 공백, 문자는 true이다. 문자 없는 경우는 false이다.

 

Fancy Indexing

- 순서 개념을 입혔다.

- arr[[4,3,0,6]] -> 0번축 기준으로 숫자는 순서를 의미한다.

arr[[1,5,7,2],[0,3,1,2]] -> 좌표라고 생각

- 1 2 3

4 5 6

7 8 9

10 11 12

arr[[3,1,2]][:0:1] : 범위의 값 순서대로 출력

-> 10 11 12

4 5 6

7 8 9

 

 

 

 

5. Numpy : Brodadcating

- (4,3) + (3) = (4,3)

0 0 0 1 2 3 1 2 3

1 1 1 1 2 3 2 3 4

2 2 2 1 2 3 3 4 5

3 3 3 1 2 3 4 5 6

 

- 차원 수가 다르면 차원이 적은 쪽에 차원을 추가하는데 이 때 차원 수는 1

 

- 차원 수가 같으면 차원의 크기가 모두 같거나 한 쪽의 차원의 크기가 1이여지만 브로드 캐스팅이 가능하다

 

- 차원이 1인 쪽은 상대방 차원의 수와 일치시킨다. - 복제

 

- R 같은 경우는 제한 없이 복제해서 계산한다.

 

 

 

 

6. Python : List Comprehension

- names = ['bob','job','will','bob']

result = [name=='bob' for name in names]

 

- for문 보다 빠르다

 

 

 

 

7. Python : Generator & Generator Expression

 

 

 

8. NumPy : Universal Function

- 데이터 원소별로 연산을 수행하는 함수.

 

- 하나 이상의 스칼라 값을 받아서 하나 이상의 스칼라 결과 값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 벡터화된 래퍼 함수라고 생각하면 된다.

 

- np.sqrt(), np.modf() 등등..

 

 

 

 

 

9. np.where() : 조건

- arr = np.random.randn(4,4)

np.where(arr>0,2,-2)

np.where(arr>0,2,arr)

 

 

 

10. ndarray.sort() vs. numpy.sort()

- ndarray.sort() : in-place operation(직접 데이터를 수정한다.)

 

- numpy.sort() : returning