ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 확장 패키지 : numpy (2)
    파이썬 Python/데이터 분석 2022. 2. 15. 21:27

    문자열 데이터  numpy 배열 형변환

    import numpy
    
    data1 = ['people', 'boy', 'girl', 'man', 'woman']
    data2 = ['1.5', '2.5', '3.5', '4.5', '5.5']
    data3 = ['10', '20', '30', '40', '50']
    
    arr1 = numpy.array(data1)
    arr2 = numpy.array(data2)
    arr3 = numpy.array(data3)
    
    print("arr1 :", arr1)
    print("arr1 데이터 타입 :", arr1.dtype) # <U6 : 유니코드, 문자의 최대수는 6자
    print("arr2 :", arr2)
    print("arr2 데이터 타입 :", arr2.dtype) # <U3 : 유니코드, 문자의 최대수는 3자
    print("arr3 :", arr3)
    print("arr3 데이터 타입 :", arr3.dtype) # <U2 : 유니코드, 문자의 최대수는 2자
    print()
    
    # 문자열을 실수로 변환
    arr4 = arr2.astype(float)
    print("arr4 :", arr4)
    print("arr4 데이터 타입 :", arr4.dtype) 
    print()
    
    # 문자열을 정수로 변환 : 반드시 문자열이 정수여야 함
    arr5 = arr3.astype(int)
    print("arr5 :", arr5)
    print("arr5 데이터 타입 :", arr5.dtype) 
    print()
    
    # arr4 = arr2.astype(int) # error 발생. 실수는 정수로 변환 불가
    
    # 숫자를 문자열로 변환
    arr6 = arr5.astype(str)
    print("arr6 :", arr6)
    print("arr6 데이터 타입 :", arr6.dtype)
    print()

    arr1 : ['people' 'boy' 'girl' 'man' 'woman']
    arr1 데이터 타입 : <U6
    arr2 : ['1.5' '2.5' '3.5' '4.5' '5.5']
    arr2 데이터 타입 : <U3
    arr3 : ['10' '20' '30' '40' '50']
    arr3 데이터 타입 : <U2

    arr4 : [1.5 2.5 3.5 4.5 5.5]
    arr4 데이터 타입 : float64

    arr5 : [10 20 30 40 50]
    arr5 데이터 타입 : int32

    arr6 : ['10' '20' '30' '40' '50']
    arr6 데이터 타입 : <U11

     

     

    난수 numpy 배열 생성

    import numpy
    
    # 0 <= 실수 난수 < 1 사이의 난수 생성
    f1 = numpy.random.rand()
    arr2 = numpy.random.rand(2, 3)
    arr3 = numpy.random.rand(2, 3, 4)
    print("f1 :", f1)
    print("arr2 :")
    print(arr2)
    print("arr3 :")
    print(arr3)
    print("f1 type :", type(f1))
    print("arr2 type :", type(arr2))
    print("arr2 배열 데이터 타입 :", arr2.dtype) 
    print("arr2 배열 형태 :", arr2.shape) 
    print("arr3 배열 형태 :", arr3.shape)
    print()
    
    # 정수 난수 : low <= 난수 < high
    # random.randint([low,] high[, size]), 기본값 : low = 0, size = 1
    n1 = numpy.random.randint(10)                   # 0~9의 정수 난수 1개 생성
    arr2 = numpy.random.randint(1, 10, size=(2, 3)) # 1~9의 2x3 행렬로 정수 난수 생성
    arr3 = numpy.random.randint(10, size=(2, 3, 4))
    print("n1 :", n1)
    print("arr2 :")
    print(arr2)
    print("arr3 :")
    print(arr3)
    print("n1 type :", type(n1))
    print("arr2 type :", type(arr2))
    print("arr2 배열 데이터 타입 :", arr2.dtype) 
    print("arr2 배열 형태 :", arr2.shape)
    print("arr3 배열 형태 :", arr3.shape)

    f1 : 0.8180219262188141
    arr2 :
    [[0.70143542 0.83651168 0.80882758]
     [0.70057787 0.34950894 0.21387394]]
    arr3 :
    [[[0.81915646 0.28758555 0.15883754 0.72291305]
      [0.00822344 0.72063841 0.0236434  0.8494338 ]
      [0.78139699 0.99672498 0.51678926 0.65930833]]

     [[0.91431708 0.39219886 0.86225485 0.82198564]
      [0.62223915 0.66120988 0.86454185 0.87464912]
      [0.2036204  0.93094409 0.57048143 0.38013993]]]
    f1 type : <class 'float'>
    arr2 type : <class 'numpy.ndarray'>
    arr2 배열 데이터 타입 : float64
    arr2 배열 형태 : (2, 3)
    arr3 배열 형태 : (2, 3, 4)

    n1 : 6
    arr2 :
    [[8 5 8]
     [4 9 5]]
    arr3 :
    [[[0 5 2 3]
      [9 6 3 9]
      [1 1 5 1]]

     [[9 4 8 1]
      [5 1 1 9]
      [2 6 7 3]]]
    n1 type : <class 'int'>
    arr2 type : <class 'numpy.ndarray'>
    arr2 배열 데이터 타입 : int32
    arr2 배열 형태 : (2, 3)
    arr3 배열 형태 : (2, 3, 4)

     

     

    Numpy 배열의 연산

    1) 사칙 연산

    - 배열의 형태(shape)가 같다면 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 할 수 있다.

     

    2) 통계 연산

    - 배열의 합, 평균, 표준편차, 분산, 최소값, 최대값, 누적합, 누적곱 등 통계에 많이 이용하는 메소드도 있다.

     

    ★ 편차 = 자료형 - 평균

    분산 = 편차^2 의 평균

    표준편차 = √분산

     

    3) 행렬 연산

    - Numpy는 배열의 단순 연산뿐만 아니라 선형 대수(Linear algebra)를 위한 행렬(2차원 배열) 연산도 지원한다.

    - 간단하게 행렬곱, 전치행렬, 역행렬, 행렬식 등을 구할 수 있다.

    (a b) (c

           d)

    행렬곱 : ac + bd

     

    (a b    (e

     c d)    f)

    행렬곱 : ae + bf

                 : ce + bf

     

    (a b    (e f

     c d)    g h)

    ★ 행렬곱 : ae + bg, af + bh

                  : ce + dg, cf + dh

     

    ★ 전치행렬 : 행과 열을 바꿈.

    a b c  d e f

    -> a d

        b e

        c  f

     

    ★ 행렬식 :  det(A) = ad - bc

    A = (a b       c d) 

     

    ★ 역행렬 : 행렬식이 0이면 역행렬은 존재하지 않음.

                  :  AB = BA 이면 역행렬

    (a b  ^-1  ->  1/det(A) * (d -b

     c d)                           -c  a)        

     

     

    import numpy
    
    data1 = [10, 20, 30, 40]
    data2 = [100, 200, 300, 400]
    
    # numpy 배열 생성
    arr1 = numpy.array(data1)
    arr2 = numpy.array(data2)
    arr_add = arr1 + arr2
    arr_sub = arr1 - arr2
    arr_mul = arr1 * arr2
    arr_div = arr1 / arr2
    arr_add2 = arr1 + 7
    arr_square = arr1 ** 2
    
    # numpy 배열 속성확인 
    print("arr1 배열 형태 :", arr1.shape) 
    print("arr2 배열 형태 :", arr2.shape)
    print()
    
    # 저장 내용 확인
    print("arr1 :", arr1)
    print("arr2 :", arr2)
    print("arr_add :", arr_add)
    print("arr_sub :", arr_sub)
    print("arr_mul :", arr_mul)
    print("arr_div :", arr_div)
    print("arr_add2 :", arr_add2)
    print("arr_square :", arr_square)

    arr1 배열 형태 : (4,)
    arr2 배열 형태 : (4,)

    arr1 : [10 20 30 40]
    arr2 : [100 200 300 400]
    arr_add : [110 220 330 440]
    arr_sub : [ -90 -180 -270 -360]
    arr_mul : [ 1000  4000  9000 16000]
    arr_div : [0.1 0.1 0.1 0.1]
    arr_add2 : [17 27 37 47]
    arr_square : [ 100  400  900 1600]

     

    import numpy
    
    arr1 = numpy.array([10, 20, 30, 40, 50, 60])
    print(arr1)
    print('-' * 30)
    
    # 통계 연산 방법1
    print(arr1.sum())     # 합
    print(arr1.mean())    # 평균
    print(arr1.std())     # 표준편차
    print(arr1.var())     # 분산
    print(arr1.min())     # 최소값
    print(arr1.max())     # 최대값
    print(arr1.cumsum())  # 누적합
    print(arr1.cumprod()) # 누적곱
    print()
    
    # 통계 연산 방법2
    print(numpy.sum(arr1))     # 합
    print(numpy.mean(arr1))    # 평균
    print(numpy.std(arr1))     # 표준편차
    print(numpy.var(arr1))     # 분산
    print(numpy.min(arr1))     # 최소값
    print(numpy.max(arr1))     # 최대값
    print(numpy.cumsum(arr1))  # 누적합
    print(numpy.cumprod(arr1)) # 누적곱
    print()
    
    # 2차원 배열에서의 평균 구하기
    arr2 = arr1.reshape(2, 3)
    print('arr2 :')
    print(arr2)
    
    print(numpy.mean(arr2))         # 전체 평균
    print(numpy.mean(arr2, axis=0)) # 열 평균
    print(numpy.mean(arr2, axis=1)) # 행 평균

    [10 20 30 40 50 60]
    ------------------------------
    210
    35.0
    17.07825127659933
    291.6666666666667
    10
    60
    [ 10  30  60 100 150 210]
    [       10       200      6000    240000  12000000 720000000]

    210
    35.0
    17.07825127659933
    291.6666666666667
    10
    60
    [ 10  30  60 100 150 210]
    [       10       200      6000    240000  12000000 720000000]

    arr2 :
    [[10 20 30]
     [40 50 60]]
    35.0
    [25. 35. 45.]
    [20. 50.]

     

     

    import numpy
    
    # numpy 배열 생성
    arr1 = numpy.array([1, 2, 3, 4]).reshape(2, 2)
    arr2 = numpy.array([10, 20, 30, 40]).reshape(2, 2)
    print("arr1 :")
    print(arr1)
    print("arr2 :")
    print(arr2)
    print("arr1 배열 형태 :", arr1.shape) 
    print("arr2 배열 형태 :", arr2.shape) 
    print("--------------")
    
    arr_dot = numpy.dot(arr1, arr2)       # 행렬곱
    arr_transpose = numpy.transpose(arr1) # 전치 행렬
    arr_inv = numpy.linalg.inv(arr1)      # 역행렬
    arr_det = numpy.linalg.det(arr1)      # 행렬식
    
    print("arr_dot :")
    print(arr_dot)
    print("arr_transpose :")
    print(arr_transpose)
    print("arr_inv :")
    print(arr_inv)
    print("arr_det :", arr_det)
    print("--------------")
    
    # 역행렬 확인, AB = I(단위 행렬)
    arr3 = numpy.linalg.inv(arr1)
    print(numpy.dot(arr1, arr3)) # 행렬곱

    arr1 :
    [[1 2]
     [3 4]]
    arr2 :
    [[10 20]
     [30 40]]
    arr1 배열 형태 : (2, 2)
    arr2 배열 형태 : (2, 2)
    --------------
    arr_dot :
    [[ 70 100]
     [150 220]]
    arr_transpose :
    [[1 3]
     [2 4]]
    arr_inv :
    [[-2.   1. ]
     [ 1.5 -0.5]]
    arr_det : -2.0000000000000004
    --------------
    [[1.00000000e+00 1.11022302e-16]
     [0.00000000e+00 1.00000000e+00]]

     

     

    numpy 배열의 인덱싱과 슬라이싱

    import numpy
    
    arr1 = numpy.array([10, 20, 30, 40, 50, 60])
    arr2 = numpy.arange(10, 100, 10).reshape(3, 3)
    print("arr1 :", arr1)
    print("arr2 :")
    print(arr2)
    print("arr1 배열 형태 :", arr1.shape)
    print("arr2 배열 형태 :", arr2.shape)
    print('-' * 30)
    
    # 1차원 배열 인덱싱
    print("arr1[2] :", arr1[2])
    print("arr1[[1, 3, 5]] :", arr1[[1, 3, 5]]) # 원하는 인덱스값 지정
    print("arr1[arr1 > 30] :", arr1[arr1 > 30]) # 조건 지정 
    print('-' * 30)
    
    arr1[2] = 555
    print("arr1 :", arr1)
    arr1[[0, 2, 3]] = [666, 777, 888]
    print("arr1 :", arr1)
    arr1[arr1 > 30] = 0
    print("arr1 :", arr1)
    print('-' * 30)
    
    # 2차원 배열 인덱싱
    # [행, 열]
    print("arr2[0, 2] :", arr2[0, 2])
    arr2[0, 2] = 35                     # 값 1개 변경
    print("arr2 :")
    print(arr2)
    arr2[1] = numpy.array([45, 55, 65]) # 1개 행 전부 변경
    print("arr2 :")
    print(arr2)
    arr2[2] = [75, 85, 95]              # 1개 행 전부 변경
    print("arr2 :")
    print(arr2)
    print('-' * 30)
    
    # 행과 열의 위치를 지정, arr2[0,0], arr2[2, 1] 선택
    print("arr2[[0, 2], [0, 1]] :", arr2[[0, 2], [0, 1]]) # 0행0열, 2행1열 지정
    arr2[[0, 2], [0, 1]] = [666, 777]
    print("arr2 :")
    print(arr2)

    arr1 : [10 20 30 40 50 60]
    arr2 :
    [[10 20 30]
     [40 50 60]
     [70 80 90]]
    arr1 배열 형태 : (6,)
    arr2 배열 형태 : (3, 3)
    ------------------------------
    arr1[2] : 30
    arr1[[1, 3, 5]] : [20 40 60]
    arr1[arr1 > 30] : [40 50 60]
    ------------------------------
    arr1 : [ 10  20 555  40  50  60]
    arr1 : [666  20 777 888  50  60]
    arr1 : [ 0 20  0  0  0  0]
    ------------------------------
    arr2[0, 2] : 30
    arr2 :
    [[10 20 35]
     [40 50 60]
     [70 80 90]]
    arr2 :
    [[10 20 35]
     [45 55 65]
     [70 80 90]]
    arr2 :
    [[10 20 35]
     [45 55 65]
     [75 85 95]]
    ------------------------------
    arr2[[0, 2], [0, 1]] : [10 85]
    arr2 :
    [[666  20  35]
     [ 45  55  65]
     [ 75 777  95]]

     

    import numpy
    
    arr1 = numpy.array([10, 20, 30, 20, 50, 60])
    arr2 = numpy.arange(10, 100, 10).reshape(3, 3)
    print("arr1 :", arr1)
    print("arr2 :")
    print(arr2)
    print("arr1 배열 형태 :", arr1.shape)
    print("arr2 배열 형태 :", arr2.shape)
    print('-' * 30)
    
    # 1차원 배열 슬라이싱
    print(arr1[1:4])
    print(arr1[:4])
    print(arr1[1:])
    print(arr1[:])
    print(arr1[::-1])
    print('-' * 30)
    
    arr1[2:5] = [35, 45, 55] # 부분 값 변경
    print("arr1 :", arr1)
    
    arr1[2:5] = 37           # 부분을 같은 값 변경
    print("arr1 :", arr1)
    print("--------------")
    
    # 2차원 배열 슬라이싱
    # 배열명[행슬라이싱 , 열슬라이싱] 
    # => 배열명[행시작위치:행끝위치, 열시작위치:열끝위치]
    print(arr2[1:3, 0:2]) # 행은 1~2, 열은 0~1 슬라이싱
    print(arr2[:3, :2])   # 행은 처음~2, 열은 처음~1 슬라이싱
    print("--------------")
    
    # 특정 행의 열만 추출하기, 배열명[행위치][열시작위치:열끝위치]
    print(arr2[1][0:2]) 
    print("--------------")
    
    print(arr2[:, 2])     # 특정 열만 추출하기
    print(arr2[:, [1,2]]) # 특정 열만 추출하기
    print(arr2[2, :])     # 특정 행만 추출하기

    arr1 : [10 20 30 20 50 60]
    arr2 :
    [[10 20 30]
     [40 50 60]
     [70 80 90]]
    arr1 배열 형태 : (6,)
    arr2 배열 형태 : (3, 3)
    ------------------------------
    [20 30 20]
    [10 20 30 20]
    [20 30 20 50 60]
    [10 20 30 20 50 60]
    [60 50 20 30 20 10]
    ------------------------------
    arr1 : [10 20 35 45 55 60]
    arr1 : [10 20 37 37 37 60]
    --------------
    [[40 50]
     [70 80]]
    [[10 20]
     [40 50]
     [70 80]]
    --------------
    [40 50]
    --------------
    [30 60 90]
    [[20 30]
     [50 60]
     [80 90]]
    [70 80 90]

     

     

    '파이썬 Python > 데이터 분석' 카테고리의 다른 글

    Matplotlib (2) - 산점도, 막대 그래프, 히스토그램  (0) 2022.02.16
    Matplotlib (1) - 그래프  (0) 2022.02.16
    파이썬 확장 패키지 : numpy (1)  (0) 2022.02.14
    반복문 - while  (0) 2022.02.09
    반복문 - for  (0) 2022.02.08
Designed by Tistory.