[Python NumPy] NumPy 배열에 축 추가하기 (adding axis to NumPy Array) : np.newaxis, np.tile
Python 분석과 프로그래밍/Python 데이터 전처리 2017. 2. 19. 23:10지난번 포스팅에서 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.], 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], In [10]: b.shape Out[10]: (3, 4)
In [11]: b_3_4_1 = b[ :, :, np.newaxis] In [12]: b_3_4_1 Out[12]: array([[[ 0], [[ 4], [[ 8], In [13]: b_3_4_1.shape Out[13]: (3, 4, 1)
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,)
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,)
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.], 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], 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], 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], 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], [[0, 1, 2, 3, 0, 1, 2, 3], [[0, 1, 2, 3, 0, 1, 2, 3], In [37]: B_3_4_8.shape Out[37]: (3, 4, 8)
|
많은 도움 되었기를 바랍니다.