# None : 파이썬의 Null
# 아나콘다 설치 : Python, Numpy, Pandas, Matplolib 모두 포함
# 인공지능
# 머신러닝(학습하는 AI)
# 딥러닝(사람의 뇌 구조를 모방)
# 모듈 - 함수들의 모음
# Numpy - 기본 베이스 모듈, Pandas, Matplolib 내부에서도 쓰이는 모듈
# 고성능 과학계산을 위한 데이터 분석 라이브러리
# Pandas - 모듈
# 행과 열로 구성된 표 형식의 데이터를 지원하는 라이브러리(엑셀모양)
# Matplolib - 모듈
# 2D 그래프로 시각화가 가능한 라이브러리
# Numpy 주요기능
# 1. 빠르고 효율적인 벡터 산술연산을 제공하는 다차원배열 제공 (ndarray 클래스)
# ndArray (; N dimensional Array - 모든 차원을 다루는 Array)
# 2. 반복문 없이 전체 데이터 배열 연산이 가능한 표준 수학 함수 (sum(), sqrt(), mean())
# 3. 선형대수, 난수 생성, 푸리에 변환
# numpy : 기본 타입 float (타입 변경 .astype('int64') 필요)
# numpy 배열 안에는 타입 1가지만 들어감(다른 타입 들어가면 1가지로 바뀜)
# numpy가 수학 연산이 빠름
# 수학 연산 기능을 많이 제공
# list의 덧셈 연산 : 두 리스트의 요소를 합
# numpy.array의 덧셈 연산 : 두 배열의 요소들의 합
# list는 Boolean Indexing이 안되, numpy.array로 변환해야 인덱싱, 슬라이싱을 할 수 있음
# numpy는 다차원 배열의 연산, 인덱싱, 슬라이싱을 위해 사용
# Numpy 모듈(라이브러리) 가져오기
# import numpy as np
# 1차원 배열 형태 numpy.ndarray클래스
# 1. 동일한 자료형의 값(배열 형태)
# 2. N 차원 형태
# 3. Index, Value
# 4. ndarray를 줄여서 array로 표현
list = [1, 2, 3, 4, 5]
arr = np.array(list)
arr
# array([1, 2, 3, 4, 5])
arr1 = np.array([1, 2, 3, 4, 5])
arr1
# array([1, 2, ,3, 4, 5])
# 2차원 배열 형태 numpy.ndarray 클래스
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
arr2
# array([[1, 2, 3],
[4, 5, 6]])
# 이미지데이터 : 3차원 데이터셋, RGB표현
# 영상데이터 : 4차원 데이터셋
# .shape : (행, 열) 확인
arr.shape
# (5,)
arr2.shape
# (2, 3)
# .size : 개수 확인
arr.size
# 5
arr2.size
# 6
# .ndim : 차원 확인
arr.ndim
# 1
arr2.ndim
# 2
# .dtype : 배열 타입 확인
arr.dtype
# dtype('int32')
# int32 작은 정수
# int64 큰 정수
print(arr.dtype)
# int32
# 3차원 배열 예제
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
arr
# array([[[1, 2],
# [3, 4]],
# [[5, 6],
# [7, 8]]])
print('배열의 크기 : ', arr.shape)
print('배열의 차원 : ', arr.ndim)
print('배열의 개수 : ', arr.size)
# 배열의 크기 : (2, 2, 2)
# 배열의 차원 : 3
# 배열의 개수 : 8
# 초기화 0값
arr_zeros = np.zeros((3, 4))
arr_zeros
# 출력 값 : array([[0., 0., 0., 0.],
# [0., 0., 0., 0.],
# [0., 0., 0., 0.]])
# 초기화 1값
arr_ones = np.ones((3, 4))
arr_ones
# 출력 값 : array([[1., 1., 1., 1.],
# [1., 1., 1., 1.],
# [1., 1., 1., 1.]])
# 초기화 지정값
arr_full = np.full((5, 5), 7)
arr_full
# 출력 값 : array([[7, 7, 7, 7, 7],
# [7, 7, 7, 7, 7],
# [7, 7, 7, 7, 7],
# [7, 7, 7, 7, 7],
# [7, 7, 7, 7, 7]])
# 나열 : for 반복으로 리스트요소 추가
list= []
for i in range(1, 51, 1) :
list.append(i)
print(list)
# [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
# 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
# 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
arr= np.array(list)
# 나열 : np.arange( , )
arr = np.arange(1, 51)
arr
# array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
# 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
# 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50])
# 간격지정 나열
arr = np.arange(1, 51, 10)
arr
# array([ 1, 11, 21, 31, 41])
# 자료형 변환
arr_type = np.array( [1.2, 2.3, 3.4], dtype = np.int64 )
arr_type
# array([1, 2, 3], dtype=int64)
arr_type = arr_type.astype("float64")
arr_type
# array([1., 2., 3.])
# 난수
arr = np.random.rand(2, 3)
arr
# array([[0.97295258, 0.28920363, 0.60553082],
# [0.12686029, 0.18115635, 0.00319909]])
# random seed를 지정하여 매번 같은 난수 생성
np.random.seed(1)
np.random. randint(1, 5, 6)
# array([2, 4, 1, 1, 4, 2])
# 랜덤값 범위지정하여 난수 생성
arr = np.random.randint(2, 10)
arr
# 2
arr = np.random.randint(2, 10, size = (2, 3))
arr
# array([[6, 3, 5],
# [4, 6, 2]])
# 배열의 요소 합
arr = np.array([1, 2, 3])
arr
# array([1, 2, 3])
arr + arr
# array([2, 4, 6])
arr * arr
# array([1, 4, 9])
arr = np.arange(2, 10, 2)
print(arr)
print(arr / 2.0)
# [2 4 6 8]
# [1. 2. 3. 4.]
# Indexging
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr
# array([[1, 2, 3],
# [4, 5, 6]])
print(arr[0][0])
# [1 2 3]
print(arr[0,0])
# 1
# Slicing
arr1 = np.arange(10)
arr1
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr1[3:8]
# array([3, 4, 5, 6, 7])
arr1[3:8] = 12
arr1
# array([ 0, 1, 2, 12, 12, 12, 12, 12, 8, 9])
# delimiter : 구분자
# BMI 구하기
data = np.loadtxt("data/height_weight.txt", delimiter = ",")
data
height = data[0] / 100
weight = data[1]
BMI = weight / height**2
BMI
# 출력 값 : array([21.37153104, 27.07018468, 25.86122449, 24.20652885, 16.03543423,
20.14486193, 23.14392095, 21.69720651, 23.62028791, 25.59220998])
# 제곱 계산
# **2
# np.square()
# 행, 열 크기 지정 2차원 array생성
arr2 = np.arange(50).reshape(5, 10)
arr2
# array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
# [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
# [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
# [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]])
arr2 = np.arange(50).reshape(5, -1)
arr2
# array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
# [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
# [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
# [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
# [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]])
# 2차원 array Indexing
arr2[[2,3], [4, 6]]
# array([24, 36])
# 2차원 array Slicing
arr2[3:4, 3:8]
# array([[33, 34, 35, 36, 37]])
arr = np.arange(18).reshape(3, -1)
arr
# array([[ 0, 1, 2, 3, 4, 5],
# [ 6, 7, 8, 9, 10, 11],
# [12, 13, 14, 15, 16, 17]])
arr[1:,[1,3,5]]
# array([[ 7, 9, 11],
[13, 15, 17]])
# Boolean Indexing
name_score = np.array(np.random.randint(50, 100, size = 8)
name_socre
# array([68, 57, 81, 52, 76, 88, 71, 88])
name_score >= 80
# array([False, False, True, False, False, True, False, True])
name_score[name_score >= 80]
# array([81, 88, 88])
# Universally 함수
print(name_score.sum())
print(np.sum(name_score))
print(np.mean(name_score))
print(np.mean(name_score))
print(np.sqrt(name_score))
print(np.abs(name_score))
# 581
# 581
# 72.625
# 72.625
# [8.24621125 7.54983444 9. 7.21110255 8.71779789 9.38083152
# 8.42614977 9.38083152]
# [68 57 81 52 76 88 71 88]