파이썬

[데이터 분석] 넘파이 모듈 Numpy

묘 Myo 2022. 4. 19. 19:48

1. 넘파이란?

수학, 과학 계산용 패키지

•성능 : 파이썬 리스트보다 빠름

•메모리 사이즈 : 파이썬 리스트보다 적은 메모리를 사용

•빌트인 함수 : 선형대수, 여러 함수들을 내장

 

import numpy

#별칭(alias) 지정
import numpy as np

1-1 array (배열)

•여러 값들의 그룹

arr = np.array([1,2,3,4])
arr

array([1, 2, 3, 4])

type(arr) #ndarray = n dimension array

numpy.ndarray

list1 = [1,2,3,4]
list2 = ([1,2,3,4], [5,6,7,8])
print(list1)
print(list2)

[1, 2, 3, 4]

([1, 2, 3, 4], [5, 6, 7, 8])

#리스트로부터 ndarray 생성
arr1 = np.array(list1)
arr2 = np.array(list2)
arr1.shape #차원
arr2.shape

(4,)

(2,4)

 

1-2 array에서의 data 타입

•array에서는 list와는 다르게 1개의 단일 데이터 타입만 허용

list = [1, 3.14, '🎈', '1234']
list #[1, 3.14, '🎈', '1234']
list[2] #'🎈'

 

int와 float 타입이 같이 존재하는 경우

#float 타입으로 저장

arr = np.array([1,2,3,3.14])
arr #array([1.  , 2.  , 3.  , 3.14])

#int와 float 타입이 같이 존재하는 경우, dtype을 int로 설정

arr = np.array([1,2,3,3.14], dtype=int)
arr #array([1, 2, 3, 3])

#int와 str 타입이 같이 존재하는 경우

arr = np.array([1,3.14,'🎈','1234'])
arr #array(['1', '3.14', '🎈', '1234'], dtype='<U32')

 

1-3 슬라이싱 (slicing)

•배열의 부분 선택

arr = np.array(['🎈','🎄','🎀','🎁','🎨'])
arr.shape #(5,)
arr = np.array(['🎈','🎄','🎀','🎁','🎨'])
print(arr[0]) #🎈
print(arr[4]) #🎨

 

•2차원 array

arr2d = np.array([[1,2,3,4],
                 [5,6,7,8],
                 [9,10,11,12]])
arr2d.shape #(3, 4)
arr2d[0,2] #3
arr2d[2,1] #10

 

•범위 색인

arr #array(['🎈', '🎄', '🎀', '🎁', '🎨'], dtype='<U1')

# index 1이상 끝까지

arr[1:] #array(['🎄', '🎀', '🎁', '🎨'], dtype='<U1')

# index 3미만까지

arr[:3] #array(['🎈', '🎄', '🎀'], dtype='<U1')

# index 1이상 3미만

arr[1:3] #array(['🎄', '🎀'], dtype='<U1')
arr[:1] #array(['🎈'], dtype='<U1')

# 0 row(행)을 모두 가져오기

arr2d[0,:] #array([1, 2, 3, 4])

# 1 col(열)을 모두 가져오기

arr2d[:,1] #array([ 2,  6, 10])
arr2d[:2,:] #array([[1, 2, 3, 4], [5, 6, 7, 8]])
arr2d[:2,2:] #array([[3, 4], [7, 8]])

 

1-4 Fancy 인덱싱

•범위가 아닌 특정 index의 집합의 값을 선택하여 추출하고 싶을 때 활용

arr = np.array([10, 23, 2, 7, 90, 65, 32, 66, 70])
idx = [1, 3, 5] #추출하고 싶은 인덱스를 괄호로 묶어 저장
arr[idx] #array([23,  7, 65])
arr2d = np.array([[1,2,3,4],
                 [5,6,7,8],
                 [9,10,11,12]])
arr2d[[0,1], :] #array([[1, 2, 3, 4], [5, 6, 7, 8]])

 

1-5 Boolean 인덱싱

•조건 필터링을 통하여 Boolean값을 이용한 색인

#True와 False 값으로 색인
myValue = [True, False, True]
arr[myValue] #array 값의 개수가 맞지 않음

myValue=[True, False, True, True, False]
arr[myValue] #array(['🎈', '🎀', '🎁'], dtype='<U1')

조건필터

arr2d > 2 #array([[False, False,  True,  True], [ True,  True,  True,  True], [ True,  True,  True,  True]])
arr2d[arr2d>2] #array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
arr2d[arr2d<5] #array([1, 2, 3, 4])

 

2. Matrix(행렬)

2-1 행(row) + 열(column)

데이터 분석 및 기계학습에 있어서 행렬을 빼놓고 얘기할 수 없음

 

▸덧셈

- shape가 같아야 함

- 같은 position끼리 연산

▸뺄셈

- shape가 같아야 함

- 같은 position끼리 연산

▸곱셈

-맞닿는 shape가 같아야 함

 

2-2 arrange란?

•arrange: 순차적인 값을 생성할 때 사용

arr = [1,2,3,4,5,6,7,8,9,10]
arr #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arr = np.arange(1,11)
arr #array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
arr = np.arange(start=1, stop=11)
arr #array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
arr = np.arange(start=1, stop=11, step=2)
arr #array([1, 3, 5, 7, 9])

2-3 range(numpy와는 상관없는 python문법)

•range는 범위를 지정해주는 함수

•보통 for in의 반복문에서 많이 사용

arr = np.arange(1, 11)
for i in arr:
  print(i) #1 2 3 4 5 6 7 8 9 10
for i in range(1,11):
  print(i) #1 2 3 4 5 6 7 8 9 10

 

2-4 정렬(sort)

arr = np.array([1,10,5,8,3,9,7,2,4,6])

 #기본적으로 오름차순 정렬 
np.sort(arr) #array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
#내림차순 정렬은 -1값을 설정, 값이 유지되지 않음
np.sort(arr)[::-1] #array([10,  9,  8,  7,  6,  5,  4,  3,  2,  1])
np.sort(arr) #array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
arr #array([ 1, 10,  5,  8,  3,  9,  7,  2,  4,  6])
result=np.sort(arr)
result #array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

 

N차원 정렬

arr2d = np.array([[11,10,12,9],
                 [3,1,4,2],
                 [5,6,7,8]])
arr2d.shape #(3,4)

#열 정렬(왼쪽에서 오른쪽으로)

np.sort(arr2d, axis=1)
#array([[ 9, 10, 11, 12],
#       [ 1,  2,  3,  4],
#       [ 5,  6,  7,  8]])

#행 정렬(위에서 아래로)

np.sort(arr2d, axis=0)
#array([[ 3,  1,  4,  2],
#       [ 5,  6,  7,  8],
#       [11, 10, 12,  9]])

 

#index를 반환하는 argsort

arr2d = np.array([[5,6,7,8],
                 [3,1,4,2],
                 [11,10,12,9]])
np.argsort(arr2d, axis=0)
#array([[1, 1, 1, 1],
#       [0, 0, 0, 0],
#       [2, 2, 2, 2]])
arr2d = np.array([[1,5,6,8],
                  [10,3,7,1],
                  [3,4,8,6]])
np.argsort(arr2d, axis=1)
#array([[0, 1, 2, 3],
#       [3, 1, 2, 0],
#       [0, 1, 3, 2]])
np.argsort(arr2d, axis=0)
#array([[0, 1, 0, 1],
#       [2, 2, 1, 2],
#       [1, 0, 2, 0]])

 

2-5 행렬-덧셈

#덧셈

import numpy as np

a=np.array([[1,2,3],
            [2,3,4]])

b=np.array([[3,4,5],
            [1,2,3]])

 

a+b #array([[4, 6, 8], [3, 5, 7]])
a=np.array([[1,2,3],
            [2,3,4]])

b=np.array([[1,2],
            [3,4],
            [5,6]])
a+b

#sum

a=np.array([[1,2,3],
            [2,3,4]])
np.sum(a, axis=0) #array([3, 5, 7])
np.sum(a, axis=1) #array([6, 9])

 

2-6 행렬-뺄셈

a=np.array([[1,2,3],
            [2,3,4]])

b=np.array([[3,4,5],
            [1,2,3]])
a-b #array([[-2, -2, -2], [ 1,  1,  1]])
a=np.array([[1,2,3],
            [2,3,4]])

b=np.array([[1,2],
            [3,4],
            [5,6]])
a-b

2-7 행렬-곱셈

#일반 곱셈

a=np.array([[1,2,3],
            [2,3,4]])

b=np.array([[3,4,5],
            [1,2,3]])
print(a.shape) #(2,3)
print(b.shape) #(2,3)
a*b #array([[ 3,  8, 15], [ 2,  6, 12]])
a=np.array([[1,2,3],
            [2,3,4]])

b=np.array([[1,2],
            [3,4],
            [5,6]])
a*b

단순 곱셈과 dot product는 다름

a=np.array([[1,2,3],
            [2,3,4]])

b=np.array([[1,2],
            [3,4],
            [5,6]])
a.shape, b.shape #((3,3), (3,2))
np.dot(a,b) #array([[22, 28], [31, 40]])

 

3. Broadcastring

1-1 숫자의 연산(단일)

a = np.array([[1,2,3], [2,3,4]])
b = np.array([[3,3,3], [3,3,3]])
a+b #array([[4, 5, 6], [5, 6, 7]])
a-3 #array([[-2, -1,  0], [-1,  0,  1]])
a*3 #array([[ 3,  6,  9], [ 6,  9, 12]])
a/3 #array([[0.33333333, 0.66666667, 1.        ], [0.66666667, 1.        , 1.33333333]])