ABOUT ME

초보 개발자의 코딩 노트( 코딩탕탕)

Today
Yesterday
Total
  • Python 데이터분석 기초 2 - Numpy(배열), list vs Numpy
    Python 데이터 분석 2022. 10. 28. 13:21

     

    # numpy
    import numpy as np
    
    ss = ['tom', 'james', 'oscar', 1]
    print(ss, type(ss))   # <class 'list'>
    
    ss2 = np.array(ss)
    print(ss2, type(ss2)) # <class 'numpy.ndarray'>
    # numpy 배열은 배열 안에 , 가 들어가지 않는다.
    # numpy는 배열 안에 같은 type만 들어가야 되므로 위를 예로들면 숫자가 들어가도 Str 타입으로 들어간다.
    
    # 메모리 비교(list vs numpy)
    li = list(range(1, 11))
    print(li)
    print(li[0], li[1], id(li[0]), id(li[1])) # 별도의 객체 주소를 기억
    print(li * 10)      # 10번 출력한다.
    
    print()
    num_arr = np.array(li)
    print(num_arr[0], num_arr[1], id(num_arr[0]), id(num_arr[1])) # 배열 요소들이 같은 주소를 기억
    print(num_arr * 10) # 각각 곱하기를 한다.
    print(type(num_arr), num_arr.dtype, num_arr.shape, num_arr.ndim, num_arr.size)
    print(num_arr[1], ' ', num_arr[1:5]) # 인덱싱과 슬라이싱
    
    print()
    b = np.array([[1,2,3],[4,5,6]])
    print(b.ndim) # 2차원
    print(b[0], b[0][0], b[[0]]) # 행렬이 0부터 시작한다. R은 1부터 시작. 0행 0열의 의미.
    
    c = np.zeros((2, 2))
    print(c)  # 2행 2열을 0으로 채운다.
    
    d = np.ones((2, 2))
    print(d)  # 2행 2열을 1로 채운다.
    
    e = np.full((2, 2), fill_value = 7)
    print(e)  # 2행 2열을 7로 채운다.
    
    f = np.eye(3)
    print(f)  # 3행 3열이 만들어진다.
    
    print()
    np.random.seed(0)
    
    print(np.random.rand(5))  # 균등분포
    print(np.mean(np.random.rand(50000)))
    
    print(np.random.randn(5)) # 정규분포
    print(np.mean(np.random.randn(50000)))
    
    print()
    print(list(range(1,10)))
    print(np.arange(10))
    
    print()
    a = np.array([1,2,3,4,5])
    print(a[1:4])
    print(a[1:4:2])
    print(a[1:])
    print(a[-4])
    
    b = a
    print(a)
    print(b)
    b[0] = 33
    print(a)
    print(b)
    c = np.copy(a) # 복사본(주소는 다르다.)
    c[0] = 77
    print(a)
    print(c)
    
    print('-----')
    a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
    print(a[:]) # 모두 다
    print(a[0], a[0][0], a[[0]])
    print(a[[0][0]],a[0,0])
    print(a[1, 0:2])
    
    print(a)
    b = a[:2, 1:3]
    print(b)
    b[0,0] = 88
    print(b)
    print(a)
    
    print()
    a = np.array([[1,2,3],[4,5,6],[7,8,9]])
    print(a)
    r1 = a[1, :]
    r2 = a[1:2, ]
    print(r1, r1.shape)
    print(r2, r2.shape)
    
    print()
    c1 = a[:, 1] # 전체 행, 1열
    c2 = a[:, 1:2] # 전체 행, 1열과 2열
    print(c1, c1.shape)
    print(c2, c2.shape)
    
    print()
    bool_idx = (a > 5)
    print(bool_idx)
    print(a[bool_idx])
    print(a[a > 5])
    
    <console>
    ['tom', 'james', 'oscar', 1] <class 'list'>
    ['tom' 'james' 'oscar' '1'] <class 'numpy.ndarray'>
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    1 2 1737332123952 1737332123984
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    1 2 1737378740688 1737378740688
    [ 10  20  30  40  50  60  70  80  90 100]
    <class 'numpy.ndarray'> int32 (10,) 1 10
    2   [2 3 4 5]
    
    2
    [1 2 3] 1 [[1 2 3]]
    [[0. 0.]
     [0. 0.]]
    [[1. 1.]
     [1. 1.]]
    [[7 7]
     [7 7]]
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    
    [0.5488135  0.71518937 0.60276338 0.54488318 0.4236548 ]
    0.49809639873163886
    [ 0.78391519 -0.5893529  -1.37128415  2.33394612 -0.38956958]
    -0.0002251435760211713
    
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    [0 1 2 3 4 5 6 7 8 9]
    
    [2 3 4]
    [2 4]
    [2 3 4 5]
    2
    [1 2 3 4 5]
    [1 2 3 4 5]
    [33  2  3  4  5]
    [33  2  3  4  5]
    [33  2  3  4  5]
    [77  2  3  4  5]
    -----
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    [1 2 3 4] 1 [[1 2 3 4]]
    [1 2 3 4] 1
    [5 6]
    [[ 1  2  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    [[2 3]
     [6 7]]
    [[88  3]
     [ 6  7]]
    [[ 1 88  3  4]
     [ 5  6  7  8]
     [ 9 10 11 12]]
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [4 5 6] (3,)
    [[4 5 6]] (1, 3)
    
    [2 5 8] (3,)
    [[2]
     [5]
     [8]] (3, 1)
    
    [[False False False]
     [False False  True]
     [ True  True  True]]
    [6 7 8 9]
    [6 7 8 9]

     

     

    list 와 numpy의 array의 구조는 다르다.

     

    Python의 list는 c언어를 참조하였기때문에 각각의 아이템이 주소를 가지고 있고 그것을 대표하는 것이 list 주소이다.

    유연성이 좋다는 장점이 있으나, 메모리를 많이 쓴다는 단점이 있다. 그러므로 속도가 느리다.

     

    반면에 numpy의 Array는 배열의 맨 앞의 주소 하나만 기억하고 있으면 나머지 값들은 알어서 참조되서 같이 들어오기 때문에 모든 아이템의 주소는 같다. 물론 인덱싱을 사용하여 2번째, 3번째만을 불러올 수있다.

    유연성이 떨어진다는 단점이 있으나, 메모리를 덜쓴다는 장점이 있다. 그러므로 속도가 빠르다

     

    Python의 list는 * 10을 하면 아이템의 주소가 각각 다르기때문에 10번 출력 되지만, numpy의 Array는 아이템의 주소가 같기 때문에 각각 위치의 곱셈을 한다.

     

    댓글

Designed by Tistory.