데이터분석

(1) 데이터분석_Numpy

빠스무 2023. 6. 11. 19:59
728x90

1. 넘파이(Numpy)

  • 수학, 과학 계산용 패키지
  • 자료구조(ndarray)를 제공 -> 파이썬의 list보다 속도가 빠름.

넘파이 사용 전 다운로드

!pip install numpy
import numpy as np # 넘파이를 사용하기 위해 import를 시켜준다.

1-1. ndarray

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

ndarr1 = np.array([1,2,3,4])
print(ndarr1)
print(type(ndarr1)) # ndarray = n dimension array

# 리스트를 ndarray로 변환하는 방법
ndarr1 = np.array(list1)
ndarr2 = np.array(list2)
print(ndarr1)
print(ndarr2)
print(type(ndarr1))
print(type(ndarr1[1]))
print(type(ndarr2))

1-2. ndarray의 data type

  • ndarray는 list와 다르게 1개의 단일 데이터 타입만 허용
list1 = [1,3.14,'python','🤣',True]
list1

list1[3]

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

ndarr2 = np.array([1,2,3.14,4]) # 모든 요소가 float로 변경됨
ndarr2 # 가장 큰 데이터 타입으로 바뀜

ndarr3 = np.array([1,2,3.14,True]) # 모든 요소 float로 변경
ndarr3

ndarr4 = np.array(['1',2,3.14,True]) # 모든 요소 String로 변경
ndarr4

ndarr3 = np.array([1,2,3.14,True], dtype=int) # 모든 요소 float로 변경
ndarr3

ndarr4 = np.array(['1',2,3.14,True], dtype=int) # 모든 요소 String로 변경
ndarr4 # 따옴표 떼고 숫자면 인티저 변경 가능

ndarr4 = np.array(['1','2','3.14','True'], dtype=int) # 모든 요소 String로 변경
ndarr4 # 따옴표 떼고 3.14가 float 면 작업이 두번이여서 오류

1-3. ndarray 슬라이싱

ndarr1 = np.array(['🍌','🥝','🍊','🍉','🍈'])
ndarr1

ndarr1.shape

# 인덱싱
print(ndarr1[0])
print(ndarr1[4])
print(ndarr1[-1])
print(ndarr1[-2])

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

print(ndarr2d[0,2])
print(ndarr2d[0][2])

# 0행 가져오기
print(ndarr2d[0])
print(ndarr2d[0,])
print(ndarr2d[0,:])

# 0열 가져오기
print(ndarr2d[:,0])

1-4. Fancy 인덱싱

  • 범위가 아닌 특정 index의 집합의 값들을 선택해서 추출하고 싶을 때 사용
ndarr1 = np.array([10,15,2,8,20,90,85,44,23,32])
idx = [2,5,9]
ndarr1[idx]

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

1-5. Boolean 인덱싱

  • 조건에 대한 필터링을 통해 Boolean 값을 이용한 색인을 사용
ndarr1 = np.array(['🍌','🥝','🍊','🍉','🍈'])
selValue = [True,False,True,True,False]
ndarr1[selValue]

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

ndarr2d[ndarr2d > 7]

2. 행렬 연산

2-1. 연산자

  • 덧셈, 뺄셈, 곱셈, 나눗셈은 shape가 같아야함
  • 같은 position끼리 연산
  • 내적(dot product)은 맞닿는 shape가 같아야함
  • 내적(dot product)은 떨어져 있는 shape가 결과 행렬이 됨
a = np.array([[1,2,3],[2,3,4]])
b = np.array([[3,4,5],[1,2,3]])
a.shape, b.shape # shape가 다르면 오류

# 덧셈, 뺄셈,나눗셈, 곱셈 연산
print(a+b)
print(a-b)
print(a*b)
print(a/b)

# dot product(행렬곱, 내적)
a = np.array([[1,2,3],[1,2,3],[2,3,4]])
b = np.array([[1,2],[3,4],[5,6]])
a.shape, b.shape

print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6))

np.dot(a,b)

2-2. orange

  • 순차적인 값을 생성할 때 사용
arr1 = range(1,11)
arr1

arr2 = np.arange(1, 11)
arr2

for i in arr2:
  print(i, end = " ")

2-3. sort

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

np.sort(ndarr1) # 오름차순 정렬

# 문자열 역순으로 출력하기
str1 = 'Python'
print(str1[:]) # 모든 문자를 슬라이싱
print(str1[::]) # print(str1[::1]) -> : 정방향
print(str1[::-1]) # print(str1[::-1]) -> : 역방향
print(str1[4:1:-1]) # 4번 인덱스부터 1 직전까지 역순으로 가져오기
print(str1[4::-1]) # 4번 인덱스부터 0까지 역순으로 가져오기

np.sort(ndarr1)[::-1]

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

# 행 정렬
np.sort(ndarr2d, axis = 0)

# 열 정렬
np.sort(ndarr2d, axis = 1)

# 열 정렬 내림차순
np.sort(ndarr2d,axis = 1)[:,::-1]

a = np.sort(ndarr2d, axis = 1)
np.sort(a, axis = 0)

2-4 숫자의 단일 연산

a = np.array([[1,2,3],[4,5,6]])
print(a+3)
print(a-3)
print(a*3)
print(a/3)

b = np.array([[3,3,3],[3,3,3]])
a+b