numpy - 역순 추출, 대각선

KDG·2021년 2월 8일
0

1. 역순으로 추출

배열의 값을 역순으로 추출

  • arange( )
* np.arange(3, 10, 2)
   -> array([3, 5, 7, 9])
   
# 역순으로 추출
* np.arange(10, 3, -2)  
# 스텝을 -로 지정해서 역순 추출. 스텝을 지정하지 않으면 빈칸으로 추출됨
   -> array([10,  8,  6,  4])
  • [ : : -1 ]
* np.arange(3,10,2)[::-1]
   -> array([9, 7, 5, 3])
  • flip( )
* np.flip(np.arange(3,10,2))
   -> array([9, 7, 5, 3])

2. 대각선

1차원 배열로 대각선 배열을 생성하거나, 다차원 배열로 대각선의 값들을 1차원으로 리턴할 수 있음

1) np.diag()

# 1차원 배열로 대각선 배열을 생성

a = np.array([10, 20, 30, 40, 50, 60]) 1차원 배열을 생성
-> [10 20 30 40 50 60]

* np.diag(a)  # 1차원 배열로 대각선 값을 채우고 나머지는 0으로 생성
   -> array([[10,  0,  0,  0,  0,  0],
             [ 0, 20,  0,  0,  0,  0],
             [ 0,  0, 30,  0,  0,  0],
             [ 0,  0,  0, 40,  0,  0],
             [ 0,  0,  0,  0, 50,  0],
             [ 0,  0,  0,  0,  0, 60]])
              
* np.diag((10,20,30,40,50,60))  # 직접 인자로 주어도 됨
   -> array([[10,  0,  0,  0,  0,  0],
             [ 0, 20,  0,  0,  0,  0],
             [ 0,  0, 30,  0,  0,  0],
             [ 0,  0,  0, 40,  0,  0],
             [ 0,  0,  0,  0, 50,  0],
             [ 0,  0,  0,  0,  0, 60]])
             
* np.diag((10,20,30,40,50,60), k=2)  
# k는 대각선의 시작위치를 나타냄. 2를 주면 3열부터 대각선 값을 채움
# 다 채우고 밑에 k의 수 대로 0배열을 생성
   -> array([[ 0,  0, 10,  0,  0,  0,  0,  0],
             [ 0,  0,  0, 20,  0,  0,  0,  0],
             [ 0,  0,  0,  0, 30,  0,  0,  0],
             [ 0,  0,  0,  0,  0, 40,  0,  0],
             [ 0,  0,  0,  0,  0,  0, 50,  0],
             [ 0,  0,  0,  0,  0,  0,  0, 60],
             [ 0,  0,  0,  0,  0,  0,  0,  0],
             [ 0,  0,  0,  0,  0,  0,  0,  0]])
             
* np.diag((10,20,30,40,50,60), k=-2)  
# 음수도 가능. -2를 주면 3행부터 대각선 값을 채움
# 음수는 위에 k의 수 대로 0배열을 생성
   -> array([[ 0,  0,  0,  0,  0,  0,  0,  0],
             [ 0,  0,  0,  0,  0,  0,  0,  0],
             [10,  0,  0,  0,  0,  0,  0,  0],
             [ 0, 20,  0,  0,  0,  0,  0,  0],
             [ 0,  0, 30,  0,  0,  0,  0,  0],
             [ 0,  0,  0, 40,  0,  0,  0,  0],
             [ 0,  0,  0,  0, 50,  0,  0,  0],
             [ 0,  0,  0,  0,  0, 60,  0,  0]])

# 다차원 배열로 대각선의 값을 1차원으로 리턴

ar = np.arange(12).reshape(3,4) 2차원(다차원) 배열 생성

  -> [[ 0  1  2  3]
      [ 4  5  6  7]
      [ 8  9 10 11]]
* np.diag(ar)
   -> array([ 0,  5, 10])  # 대각선의 값을 1차원 배열로 리턴
   
* np.diag(ar, k=2)
   -> array([2, 7])  # k=2기 때문에 3열부터 대각선 값 리턴(처음 0부터)
   
* np.diag(ar, k=-2)  # 음수는 3행부터 대각선 값 리턴
   -> array([8])

2) np.identity

  • 대각선의 값을 1로 생성.

  • one-hot 전용함수 : 데이터셋이 있을 경우 하나만 1이고 나머지는 0으로 채우는 것

    ** one-cold : 데이터셋이 있을 겨우 하나만 0이고 나머지는 1로 채우는 것

* np.identity(5)  # 5x5 배열의 대각선에 1로 값을 채움
   -> array([[1., 0., 0., 0., 0.],
            [0., 1., 0., 0., 0.],
            [0., 0., 1., 0., 0.],
            [0., 0., 0., 1., 0.],
            [0., 0., 0., 0., 1.]])
            
* ex) 10x10의 행렬을 만들어 지정된 원본데이터를 대입시켜 one-hot을 리턴해보자
a = [1,4,2,6,5]
np.identity(10)[a]
# 10x10 배열에 a의 형식을 대입시켜 a각각 요소에 해당되는 위치에 1로 생성
# 대입시키는 요소의 범위는 배열 크기에 맞추어야 함(예시에선 a의 요소값이 9를 넘기면 안됨)
 -> array([[0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],   # 1
           [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],   # 4
           [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],   # 2
           [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],   # 6
           [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.]])  # 5
           
* ex02)
a = [2,2,0,1,0]
np.identity(3)[a]
# 3x3 배열에 a의 형식을 대입시킴.
# 3행인데 a의 요소는 5개라서 행이 추가됨
# 대입시키는 요소의 범위는 배열 크기에 맞추어야 함(예시에선 a의 요소값이 2를 넘기면 안됨)
  -> array([[0., 0., 1.],
            [0., 0., 1.],
            [1., 0., 0.],
            [0., 1., 0.],
            [1., 0., 0.]])

3) np.eye()

np.eye는 열의 크기를 지정할 수 있음

* np.eye(3)
    -> array([[1., 0., 0.],
              [0., 1., 0.],
              [0., 0., 1.]])
              
* np.eye(4, k=1, M=3)  # k는 시작위치, M은 열의 크기
    -> array([[0., 1., 0.],
              [0., 0., 1.],
              [0., 0., 0.],
              [0., 0., 0.]])  

0개의 댓글