ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Numpy
    Base Line/python 기초 코드 2022. 2. 21. 15:07

    Numpy(Numerical python)
    np.array 함수를 사용하여 배열 생성
    리스트와는 다르게 하나의 데이터 type만 배열에 사용가능
    => dynamic typing not supported
    리스트는 객체들의 레퍼런스의 모임이지만 배열은 한개의 객체임

    import numpy as np

    a=np.array([1,2,3,4],float)
    print(a)
    #astype()메써드로 바꾸기가능
    b=a.astype(np.int16)
    print(b.dtype)

    [1. 2. 3. 4.]
    int16
     
     

    shape 넘파이 배열 차원의 구성을 반환함 // 차원의 길이를 의미
    dtype 넘파이 배열 데이터 타입 반환
    ndim (number of dimension) 몇차원인지 의미
    size  원소개수

     

    import numpy as np

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

    print(a.ndim,a.shape,a.size)

    2 (3, 4) 12

     

    array의 RANK에 따라 다음과 같이 불림
    0 scalar
    1 vector
    2 matrix
    3 3-tensor
    n n-tensor

     

    np.array([4.5,5,6],dtype=int)
    array([4, 5, 6])
     
     

    reshape
    array의 shape크기를 변경함 원소 개수는 동일(=size만 같으면 가능)

    a=[[1,2,3,4],[4,3,2,1]]

    np.array(a).shape
    (2, 4)
    a.reshape(-1,2).shape    #-1:size를 기반으로 행(row) 개수 선정
    array([1, 2, 3, 4, 4, 3, 2, 1])
    a=a.flatten()    #다차원 array를 1차원 array로 변환
    print(a.shape,a.ndim)
    (4, 2)

     

     

    인덱싱 & 슬라이싱
    행과 열 부분 나눠서 슬라이싱 가능

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

    a
    array([[1, 2, 3],
           [4, 5, 6]])
     
    a[0][1]# a[0]을 만든후에 다시 [1]인덱싱 하므로 느림
    2
    a[0,1]
    2
     
    a[:,2:]  #전체 2열이상
    a[1,1:3] #1행, 1~2열
    a[1:3]   #1행~2행 전체
    array([[3],
           [6]])

     

    배열 생성

    a=np.arange(10) #0~10까지
    print(a)
    b=np.arange(0,5,0.5)
    print(b)
    c=np.ones((1,5),int)
    print(c)
    d=np.zeros((1,5),int)
    print(d)
    e=np.empty((1,5),int)#shape만 주어지고 비어있음
    print(e)
    f=np.eye(3)#대각선 1인 행렬
    print(f)
    g=np.eye(3,5,k=2)#k값의 시작 index변경가능
    print(g)
    h=np.random.random((2,2))
    print(h)
    i=np.identity(n=3) #단위행렬 생성
    print(i)
    j= np.full((3,3),1)
    print(j)
    k = np.arange(9).reshape(3,3)
    k=np.diag(k)#대각 행렬의 값 추출
    print(k)
    l = np.linspace(0,10,num=5) #간격이 동일한 숫자들
    print(l)
    m = np.random.uniform(0,1,10).reshape(2,5)#균등분포
    print(m)
    o=np.random.normal(0,1,10).reshape(2,5)#정규분포
    print(o)

    [0 1 2 3 4 5 6 7 8 9]
    [0.  0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5]
    [[1 1 1 1 1]]
    [[0 0 0 0 0]]
    [[0 0 0 0 0]]
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    [[0. 0. 1. 0. 0.]
     [0. 0. 0. 1. 0.]
     [0. 0. 0. 0. 1.]]
    [[0.76893618 0.99737931]
     [0.59870531 0.45823205]]
    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    [[1 1 1]
     [1 1 1]
     [1 1 1]]
    [0 4 8]
    [ 0.   2.5  5.   7.5 10. ]
    [[0.44718027 0.09638236 0.67958903 0.10397707 0.13779765]
     [0.10982099 0.92789691 0.70572563 0.27952112 0.80801699]]
    [[-0.82595933 -1.10910898 -1.07887584 -1.1625917   0.37258493]
     [-1.27214653 -0.91132852  0.31568216  1.02814766  0.1145498 ]]

     

    배열 연산

    a= np.arange(9).reshape(3,3)
    print(a)
    print(a.sum())#모든축
    print(a.sum(axis=0))#0번축
    print(a.sum(axis=1))#1번축

    [[0 1 2]
     [3 4 5]
     [6 7 8]]
    36
    [ 9 12 15]
    [ 3 12 21]
    b=np.arange(27).reshape(3,3,3)
    print(b)
    print(b.sum(axis=0))
    print(b.sum(axis=1))
    print(b.sum(axis=2))

    [[[ 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 30 33]
     [36 39 42]
     [45 48 51]]
    [[ 9 12 15]
     [36 39 42]
     [63 66 69]]
    [[ 3 12 21]
     [30 39 48]
     [57 66 75]]
    print(a.mean(),a.mean(axis=0),a.std()) #평균, 표준편차
    4.0 [3. 4. 5.] 2.581988897471611
     
    #vstack, hstack, concatenate
    a=np.array([1,2,3])
    b=np.array([2,3,4])
    c=np.vstack((a,b))
    print(c)
    d=np.hstack((a,b))
    print(d)
    e=np.concatenate((a,b),axis=0)
    #f=np.concatenate((a,b),axis=1)  //원래 직선이라 방향이 axis=0뿐임
    #print(f)
    print(a+b)
    print(a-b)
    print(a*b)

    [[1 2 3]
     [2 3 4]]
    [1 2 3 2 3 4]
    [3 5 7]
    [-1 -1 -1]
    [ 2  6 12]
     
    #dot 행렬 연산
    a = np.arange(1,7).reshape(2,3)
    b = np.arange(7,13).reshape(3,2)
    print(a.dot(b))

    [[ 58  64]
     [139 154]]
    #transpose
    a=np.arange(1,7).reshape(2,3)
    print(a.transpose())
    print(a.T)

    [[1 4]
     [2 5]
     [3 6]]
    [[1 4]
     [2 5]
     [3 6]]
    #broadcating =>shape이 다른 배열간 연산을 지원하는 기능
    a=np.array([[1,2,3],[4,5,6]])
    scalar=3

    print(a+scalar)
    #뺄셈, 곱셈, 나눗셈, 몫, 제곱 가능

    [[4 5 6]
     [7 8 9]]

     

     

    비교 

    a=np.arange(10)
    print(np.any(a>5)) #하나라도 조건 만족하면 true
    print(np.all(a>5)) #모두 만족해야 true

    a=np.array([1,2,3])
    b=np.array([2,3,4])
    print(a>b)

    True
    False
    [False False False]

    a=np.array([1,2,4,5,8,78,23,3])
    print(np.argmax(a),np.argmin(a))
    b=np.array([[1,2,4,7],[9,88,4,12],[1,2,3,4]])
    print(np.argmax(b,axis=1),np.argmin(b,axis=0))

    5 0
    [3 1 3] [0 0 2 2]

    a=np.array([2,4,6,8])
    b=np.array([0,0,1,3,2,1])
    print(a[b])
    print(a.take(b))

    [2 2 4 8 6 4]
    [2 2 4 8 6 4]
     
    a= np.arange(8)
    print(a>3)
    print(a[a>3])

    [False False False False  True  True  True  True]
    [4 5 6 7]
     
     
    numpy.clip(array,min,max)

    array내의 요소들에 대해 min 값보다 작은 값들을 min값으로 바꿔주고
    max 값 보다 큰값들은 max로 바꿔줌
     
     
     
    #pillow
    #array to image
    import numpy as np
    from PIL import Image

    image = Image.open("lena.png")
    np_array = np.array(image)

    pil_image=Image.fromarray(np_array)
    pil_image.show()
     
    #image to array
    from PIL import Image
    import numpy as np

    img = Image.open("이미지 경로")
    check_img = np.array(img)
    check_img.shape
     
     
     
     
     
    reference: 네이버 커넥트, etc

    'Base Line > python 기초 코드' 카테고리의 다른 글

    pillow 이미지 rotation, flip  (1) 2022.04.18
    data_loader  (0) 2022.04.04
    Depth_Render.py  (0) 2022.03.16
    open3d extract depth map from mesh  (2) 2022.03.14
    path & os  (0) 2022.03.09
Designed by Tistory.