지난번 포스팅에서 Broadcasting을 다루어보았는데요, 이번 포스팅에서는 Broadcasting 과 관련이 있는 NumPy Array에 새로운 축 추가하는 2가지 방법을 소개해보겠습니다.

 

하나는 np.newaxis attribute 이고, 또 하나는 np.tile() method 인데요, 사용법이나 결과가 조금 다르니 데이터 처리 용도나 목적에 맞게 골라서 사용하시면 되겠습니다.

 

(1) indexing으로 길이가 1인 새로운 축을 추가하기

   : arr(:, np.newaxis, :)

 

(2) 배열을 반복하면서 새로운 축을 추가하기

   : np.tile(arr, reps)

 

 

 

 

 

  (1) indexing으로 길이가 1인 새로운 축을 추가하기 : arr(:, np.newaxis, :)

 

먼저 NumPy 모듈을 불러어고, 예제 array 를 만들어보겠습니다.

 

 

In [1]: import numpy as np


In [2]: a = np.array([1., 2., 3., 4.])


In [3]: a

Out[3]: array([ 1., 2., 3., 4.])


In [4]: a.shape

Out[4]: (4,)

 

 

 

np.newaxis attribute를 사용해서 길이가 1인 새로운 축을 하나 추가해보겠습니다.

 

 

# (1) np.newaxis : adding and inserting new axis  with length 1 by indexing

 

In [5]: a_4_1 = a[:, np.newaxis]


In [6]: a_4_1

Out[6]:

array([[ 1.],
       [ 2.],
       [ 3.],
       [ 4.]])


In [7]: a_4_1.shape

Out[7]: (4, 1)

 

 

 

 

이번에는 shape(3, 4) 인 2차원의 배열에 길이가 1인 새로운 축을 추가해서 3차원 배열을 만들어보겠습니다.  ':'를 사용해서 기존 배열의 값을 indexing 하구요, np.newaxis attribute로 새로운 축을 추가하게 됩니다.

 

 


In [8]: b = np.arange(12).reshape(3, 4)


In [9]: b

Out[9]:

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])


In [10]: b.shape

Out[10]: (3, 4)

 


# shape(3, 4, 1)

In [11]: b_3_4_1 = b[ :, :, np.newaxis]


In [12]: b_3_4_1

Out[12]:

array([[[ 0],
         [ 1],
         [ 2],
         [ 3]],

        [[ 4],
         [ 5],
         [ 6],
         [ 7]],

        [[ 8],
         [ 9],
         [10],
         [11]]])


In [13]: b_3_4_1.shape

Out[13]: (3, 4, 1)

 


# shape(3, 1, 4)

In [14]: b_3_1_4 = b[ :, np.newaxis, : ]


In [15]: b_3_1_4

Out[15]:

array([[[ 0,  1,  2,  3]],

        [[ 4,  5,  6,  7]],

        [[ 8,  9, 10, 11]]])


In [16]: b_3_1_4.shape

Out[16]: (3, 1, 4) 

 

 

 

 

 

(2) 배열을 반복하면서 새로운 축을 추가하기 : np.tile(arr, reps)

 

np.tile(arr, reps) method 는 'arr' 에는 배열을, 'reps'에는 반복하고자 하는 회수를 넣어줍니다.

'reps'에는 숫자를 넣을 수도 있고, 배열을 넣을 수도 있습니다.

 

먼저 원소 4개짜리 배열을 가지고

 - 같은 차원으로 '2번' 반복하기 : reps = 2

 - '2차원'으로 '2번' 반복하기 : reps = (2, 2)

를 차례대로 해보겠습니다.

 

 

In [17]: A = np.array([0., 1., 2., 3.])


In [18]: A

Out[18]: array([ 0., 1., 2., 3.])


In [19]: A.shape

Out[19]: (4,)

 


# reps = 2

In [20]: A_8 = np.tile(A, 2)


In [21]: A_8

Out[21]: array([ 0., 1., 2., 3., 0., 1., 2., 3.])


In [22]: A_8.shape

Out[22]: (8,)

 


# reps = (2, 2)

In [23]: A_2_8 = np.tile(A, (2, 2))


In [24]: A_2_8

Out[24]:

array([[ 0.,  1.,  2.,  3.,  0.,  1.,  2.,  3.],
        [ 0.,  1.,  2.,  3.,  0.,  1.,  2.,  3.]])


In [25]: A_2_8.shape

Out[25]: (2, 8)

 

 

 

 

다음으로 2차원 배열에 np.tile() method를 사용해서

 - 배열을 반복하기

 - 배열을 반복하면서 차원을 하나 더 추가하기

를 해보겠습니다.

 

 

In [26]: B = np.arange(8).reshape(2, 4)


In [27]: B

Out[27]:

array([[0, 1, 2, 3],
        [4, 5, 6, 7]])


In [28]: B.shape

Out[28]: (2, 4)


In [29]: B_2_8 = np.tile(B, 2)


In [30]: B_2_8

Out[30]:

array([[0, 1, 2, 3, 0, 1, 2, 3],
        [4, 5, 6, 7, 4, 5, 6, 7]])


In [31]: B_2_8.shape

Out[31]: (2, 8)


In [32]: B_4_4 = np.tile(B, (2, 1))


In [33]: B_4_4

Out[33]:

array([[0, 1, 2, 3],
        [4, 5, 6, 7],
        [0, 1, 2, 3],
        [4, 5, 6, 7]
])


In [34]: B_4_4.shape

Out[34]: (4, 4)


In [35]: B_3_4_8 = np.tile(B, (3, 2, 2))


In [36]: B_3_4_8

Out[36]:

array([[[0, 1, 2, 3, 0, 1, 2, 3],
         [4, 5, 6, 7, 4, 5, 6, 7],
         [0, 1, 2, 3, 0, 1, 2, 3],
         [4, 5, 6, 7, 4, 5, 6, 7]],

        [[0, 1, 2, 3, 0, 1, 2, 3],
         [4, 5, 6, 7, 4, 5, 6, 7],
         [0, 1, 2, 3, 0, 1, 2, 3],
         [4, 5, 6, 7, 4, 5, 6, 7]],

        [[0, 1, 2, 3, 0, 1, 2, 3],
         [4, 5, 6, 7, 4, 5, 6, 7],
         [0, 1, 2, 3, 0, 1, 2, 3],
         [4, 5, 6, 7, 4, 5, 6, 7]]]
)


In [37]: B_3_4_8.shape

Out[37]: (3, 4, 8)

 

 

 

많은 도움 되었기를 바랍니다.

 

728x90
반응형
Posted by Rfriend
,