02.Numpy

时间:2023-12-19 18:16:38

01.array

 # -*- coding: utf-8 -*-
 """
 Numpy 패키지 특징
  - 선형대수(벡터, 행렬) 연산에 효과적인 함수 제공
  - list 차이점 : 다차원 배열, 선형대수 연산, 속도 고속
  - Series 공통점
    -> 수학/통계 함수
    -> 범위 수정, 블럭 연산
    -> indexing/slicing 기능
  - n차원 배열 객체 생성 함수
    1. random 함수
    2. array 함수
    3. sampling 함수
    4. arange 함수
 """

 import numpy as np

 # numpy 1차원 자료구조
 lst = [1,2,3]
 arr = np.array(lst)
 print(lst) # [1, 2, 3]
 #print(lst**2) # error
 print(arr) # [1 2 3]
 print(arr**2) # [1 4 9]
 print(type(arr)) # <class 'numpy.ndarray'>

 lst2 = [1, "two", False]
 print(lst2) # [1, 'two', False]

 arr2 = np.array(lst2)
 print(arr2) # ['1' 'two' 'False']
 print(arr2.shape) # (3,)

 # 1. random 함수 : 난수 생성
 #help(np.random.randn)

 data = np.random.randn(3, 4) # 3행4열-12난수 생성
 print(data)
 '''
 [[ 0.21625386 -1.11271239  1.26352269 -0.29090546]
  [ 1.19998039 -0.93916248 -0.96475192 -0.71720834]
  [-0.35985917  0.46820202  0.20267762  0.56218989]]
 '''

 for row in data :
     print('행 평균 :', row.mean())
     print('행 합계 :', row.sum())

 # 1) 수학/통계 함수
 print('합계=', data.sum())
 print('평균=', data.mean())
 print('분산=',data.var())
 print('표준편차=',data.std())

 # 2) 블럭연산
 print(data + data) # 2배

 # 3) indexing
 print(data[2,2]) # 3행3열
 print(data[:,2]) # 3열 전체 

 # 2. array 함수 : 다차원 배열 

 # 1) 단일 list - 1차원
 lst1 = [3, 5.6, 4, 7, 8]
 arr1 = np.array(lst1)
 print(arr1)

 # 분산/표준편차
 print('분산=', arr1.var())
 print('표준편차=', arr1.std())
 '''
 분산= 3.4016000000000006
 표준편차= 1.8443427013437608

 모집단 분산, 표준편차
 분산 = sum((x-avg)**2) / n
 표본 분산
 분산 = sum((x-avg)**2) / n-1
 '''
 avg = arr1.mean()
 diff = arr1 - avg # braodcast
 var_result = sum(diff**2) / len(arr1)
 print('분산=', var_result)
 # 분산= 3.4016000000000006
 std_result = np.sqrt(var_result)
 print('표준편차=', std_result)
 '''
 분산= 3.4016000000000006
 표준편차= 1.8443427013437608
 '''

 # 2) 중첩 list ->  2차원
 lst2 = [[1,2,3,4,5], [6,7,8,9,10]]
 print(lst2)
 arr2  = np.array(lst2)
 print(arr2)
 print(arr2.shape) # (2, 5)
 print(np.shape(arr2)) # (2, 5)

 # ppt. 21
 print(arr2[1,:]) # 2행 전체 - [ 6  7  8  9 10]
 print(arr2[:,2]) # 3열 전체 - [3 8]
 print(arr2[1,2]) # 2행3열 - 8
 print(arr2[:,1:3])
 '''
 [[2 3]
  [7 8]]
 '''

 # broadcast 연산(선형대수)
 # - 작은 차원이 큰 차원으로 늘어남 

 # 1) scala(0) vs vector(1)
 print(arr1) # [3.  5.6 4.  7.  8. ]
 print(arr1 * 0.5) # [1.5 2.8 2.  3.5 4. ]

 # 2) scala(0) vs matrix(2)
 print(arr2 * 0.5)

 # 3) vector(1) vs matrix(2)
 print(arr1 + arr2)
 '''
 [3.  5.6 4.  7.  8. ]
    +
 [[ 1  2  3  4  5]
  [ 6  7  8  9 10]]
    =
 [[ 4.   7.6  7.  11.  13. ]
  [ 9.  12.6 12.  16.  18. ]]
 '''

 # 3. sampling 함수

 # 1) choice함수 : 관측치 행 번호 추출
 num = list(range(11)) # 0~10
 print(num)
 n = len(num)

 #np.random.choice : 패키지.모듈.함수()
 idx = np.random.choice(n, 5, replace=False)
 # replace=False : 비복원
 print(idx) # [4 3 1 5 0]

 import pandas as pd 

 score = pd.read_csv("../data/score_iq.csv")
 print(score.info())
 '''
 RangeIndex: 150 entries, 0 to 149
 Data columns (total 6 columns):
 '''

 # train : 70%, test : 30%
 n=len(score)

 idx = np.random.choice(n, int(n*0.7), replace=False)

 # pandas -> numpy
 np_score = np.array(score)
 print(np_score.shape) # (150, 6)

 train_set = np_score[idx, :]
 print(train_set.shape) # (105, 6)

 # test set : list+for
 # [실행문-3  for-1  if-2]
 test_idx = [i  for i in range(150) if i not in idx]
 print(test_idx)

 test_set = np_score[test_idx, :]
 print(test_set.shape) # (45, 6)

 # 2) shuffle 함수
 #help(np.random.shuffle) # x : array or list

 print(np_score[:10,:])

 np.random.shuffle(np_score) # array
 print(np_score[:10,:])

 # 4. arange 함수 : range(n) : 0~n-1 동일
 zerr = np.zeros((3, 5))
 print(zerr)
 '''
 [[0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]
  [0. 0. 0. 0. 0.]]
 '''

 cnt = 0
 for i in np.arange(3) : # 0~2
     for j in np.arange(5) : # 0~4
         cnt += 1 # 카운터
         zerr[i,j] = cnt

 print(zerr)
 '''
 [[ 1.  2.  3.  4.  5.]
  [ 6.  7.  8.  9. 10.]
  [11. 12. 13. 14. 15.]]
 '''
 cnt = 0
 for i in range(3) : # 0~2
     for j in range(5) : # 0~4
         cnt += 1 # 카운터
         zerr[i,j] = cnt

 print(zerr)
 '''
 [[ 1.  2.  3.  4.  5.]
  [ 6.  7.  8.  9. 10.]
  [11. 12. 13. 14. 15.]]
 '''

02.indexing

 # -*- coding: utf-8 -*-
 """
 numpy indexing
   - 2,3차원 indexing
   - boolean indexing
 """

 import numpy as np

 # 1. indexing
 '''
 1차원 : obj[index]
 2차원 : obj[row, col] - row default
 3차원 : obj[side, row, col] - side default
 '''

 # 2차원 indexing
 arr2d = np.array([[1,2,3], [4,5,6], [7,8,9]])
 print(arr2d.shape) # (3, 3)

 print(arr2d[1]) # 2행 전체 - [4 5 6]
 print(arr2d[:,1]) # 2열 전체 - [2 5 8]
 print(arr2d[1,2]) # 2행3열 - 6

 # 3차원 indexing
 arr3d = np.array([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]])
 print(arr3d)
 print(arr3d.shape) # (2, 2, 3)

 print(arr3d[1]) # 2면 전체
 print(arr3d[1, 0]) # 2면 1행 전체
 print(arr3d[1, 0, 2]) # 2면 1행 3열
 '''
 [[ 7  8  9]
  [10 11 12]]
 [7 8 9]
 9
 '''

 print(arr3d[1, :, :2])
 '''
 [[ 7  8]
  [10 11]]
 '''

 # 4. boolean indexing
 data = np.random.randn(3, 4) # 12개
 print(data)

 # 부울리언 색인
 result = data[data >= 0.7]
 print(result)

 # 0.3 ~ 0.7
 #result = data[data >= 0.3 and data <= 0.7]

 result2 = data[np.logical_and(data >= 0.3, data <= 0.7)]
 print(result2)
 '''
 [1.06451721 0.9287353 ]
 [0.6895027]
 '''

03.reshape

 # -*- coding: utf-8 -*-
 """
  reshape : 모양 변경
   - 1차원 배열 -> 2차원 배열
   - 2차원 배열 -> 다른 모양 변경
  T : 전치행렬(행렬 위치 변경)
  swapaxis : 축 변경
  transpose : 축 번호 순서에 의해서 구조 변경
 """

 import numpy as np

 # 1. reshape
 lst = range(1,13) # 1~12

 # 1차원 -> 2차원
 arr2d = np.array(lst).reshape(3,4) # 1차원 -> 2차원
 print(arr2d)
 print(arr2d.shape) # (3, 4)

 # 2차원 모양 변경
 arr2d = np.array(arr2d).reshape(2,6) # 주의 : 수 일치
 print(arr2d.shape) # (2, 6)

 # 2차원 -> 3차원
 arr3d = np.array(arr2d).reshape(1,4,3)
 print(arr3d)
 print(arr3d.shape) # (1, 4, 3)
 '''
 [[[ 1  2  3]
   [ 4  5  6]
   [ 7  8  9]
   [10 11 12]]]
 '''

 # 2. 전치행렬(행<->열)
 print(arr2d.T)
 print(arr2d.T.shape) # (6, 2)

 # 3. swapaxes
 # axis = 0(행), axis=1(열)
 print(arr2d.swapaxes(0,1)) # (6, 2)

 # 4. transpose
 '''
 1차원 : 효과 없음
 2차원 : 행<-열 교환 = 전치행렬
 3차원 : 축 순서에 의해서 구조 변경(o)
 '''

 arr3d = np.arange(1,25).reshape(4, 2, 3) # 1~24
 print(arr3d)
 print(arr3d.shape) # (4, 2, 3) - (면,행,열)

 # 3차원 : (0,1,2) -> (2,1,0) : 역순
 arr3d_def = arr3d.transpose() # default : (2,1,0)
 print(arr3d_def)
 print(arr3d_def.shape) # (3, 2, 4)

 # (0,1,2) -> (2,0,1)
 arr3d_user = arr3d.transpose(2,0,1)
 print(arr3d_user)
 print(arr3d_user.shape) # (3, 4, 2)

04.axis_dot

 # -*- coding: utf-8 -*-
 """
  1. axis : 행축, 열축
  2. np.dot() : 행렬곱 - tf.matmul()
  3. ANN에서 행렬곱
     - 은닉층(H) = 입력(X) * 가중치(W) + 편향(B)
  4. 회귀분석 모델 행렬곱
     - 예측치(Y) = 입력(X) * 기울기(a) + 절편(b)
 """

 import numpy as np

 # 1. axis : ppt. 56
 # 행축 : 열들의 모임(열 단위)
 # 열축 : 행들의 모음(행 단위)

 arr = np.arange(1,21).reshape(5,4)
 print(arr)

 print('전체 합계=',arr.sum())
 print('열 단위 합계=',arr.sum(axis=0)) # 열 단위
 print('행 단위 합계=',arr.sum(axis=1)) # 행 단위
 '''
 전체 합계= 210
 열 단위 합계= [45 50 55 60]
 행 단위 합계= [10 26 42 58 74]
 '''

 # 2. np.dot(a, b) # a,b : 행렬
 a = np.array([[1,1], [0,1]])
 print(a.shape) # (2, 2)
 b = np.array([[2,3], [1,5]])
 print(b.shape) # (2, 2)
 '''
 행렬곱 조건
 1. a,b 모두 행렬
 2. a(열) == b(행) : 수 일치
 '''

 c = np.dot(a, b)
 print(c)
 print(c.shape)
 '''
 a(r,c) * b(r,c) = c(a(r), b(c))
 [[3 8]
  [1 5]]
 (2, 2)
 '''

 print(np.ndim(a), np.ndim(b), np.ndim(c))
 # 2 2 2

 # 1) 1개 관측치 : x(1,2) * w(2,2) = h(1,2)
 x = np.array([[0.1, 0.2]])
 w = np.array([[1,2], [2,3]])
 print(x.shape) # (1, 2)
 print(w.shape) # (2, 2)

 h = np.dot(x, w)
 print('h=', h) # h= [[0.5 0.8]]
 print(h.shape) # (1, 2)

 # 2) 2개 관측치 : x(2,2) * w(2,3) = h(2,3)
 x = np.array([[0.1, 0.2], [0.3, 0.4]]) # (2,2)
 w = np.array([[1,2,3],[2,3,4]]) # (2,3)

 h = np.dot(x, w)
 print('h=')
 print(h)
 print(h.shape) # (2, 3)

05.dot_example

 # -*- coding: utf-8 -*-
 """
 ANN Model example
 """

 import numpy as np

 # 1. ANN model
 '''
 input x : image(28x28)
 hidden node : 32개
 weight : 28x32
 '''

 # x data 생성
 print('>>> x image data <<<')
 x_img = np.random.randint(0,2, 784) # image vector(0 or 1)
 x_img2d = x_img.reshape(28, 28) # matrix
 print(x_img2d)
 print(x_img2d.shape) # (28, 28)

 # weight data 생성
 print('>>> weight data <<<')
 weight = np.random.randn(28, 32)
 print(weight)
 print(weight.shape) # (28, 32)

 # hidden node 생성
 print('>>> hidden node <<<')
 # (28, 28) * (28, 32) = (28, 32)
 hidden = np.dot(x_img2d, weight)
 print(hidden)
 print(hidden.shape)

相关文章