[python] numpy에서 사용하는 axis 기본 구조



python numpy가 사용하는 axis 구조를 알아보는 글입니다. 혹여 틀린 내용은 댓글 부탁드립니다.



axis 란

python에서 axis란 차원을 의미합니다.
따라서 1차원 배열에서 axis는 0이 존재하며, 2차원 배열에서 axis는 0(행), 1(열)이 존재합니다. numpy 함수에서는 axis를 기준으로 값들을 처리하는데, axis가 생각보다 헷갈리기 때문에 axis의 개념을 알아보겠습니다.


numpy 배열의 차원을 알아보는 방법으로는 shape 함수를 사용합니다.


shape을 통해 데이터가 몇 차원으로 몇 개의 데이터가 구성되어 있는지 확인할 수 있습니다.

1. numpy에서 사용하는 axis 구조 (1차원)

arr = np.array([1, 2, 3, 4])
print('arr.shape: ', arr.shape)

# 출력
# arr.shape:  (4,)
np shape 함수를 통해 1차원 배열을 확인할 수 있습니다.
(4, )는 1차원의 데이터로 총 4개의 데이터를 가지고 있음을 나타냅니다.

axis는 차원의 수 만큼 존재합니다. (0부터 시작)
1차원 -> axis 0
2차원 -> axis 1, 2

1차원 배열 shape axis 순서


1차원 배열을 그림으로 그릴 때 axis를 구상하는 방식에 따라 '표현'의 차이가 있을 수 있습니다.
Ex.
위의 1, 2번은 동일한 배열에 대해 axis를 어디로 표현했느냐에 차이일 뿐 모두 '같은 내용을 그림 상 다르게 표현'한 겁니다.
여기에서는 1번 그림으로 axis를 설명할 예정이니, 다른 블로그의 그림과 다르다고 헷갈리지 않기를 바랍니다.

axis 0 방향으로 배열에 접근한 뒤


가져온 배열 값을 출력합니다.
print('arr[0]: 'arr[0])
print('arr[1]: 'arr[1])
print('arr[2]: 'arr[2])
print('arr[3]: 'arr[3])

# 출력
# arr[0]:  1
# arr[1]:  2
# arr[2]:  3
# arr[2]:  4

2. numpy에서 사용하는 axis 구조 (2차원)

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print('arr.shape: ', arr.shape)

# 출력
# arr.shape:  (2, 4)
(2, 4)는 2차원의 데이터로 총 8개(2*4)의 데이터를 가지고 있음을 나타내며,
numpy에서 2차원 배열은 (행, 열)로 구성되어 있습니다.

2차원 배열 shape axis 순서


2차원 배열도 동일하게 axis를 구상하는 방식에 따라 '표현'의 차이가 있을 수 있습니다.
Ex.
위의 1, 2번은 동일한 배열에 대해 axis를 어디로 표현했느냐에 차이일 뿐 모두 '같은 내용을 그림 상 다르게 표현'한 것이며, 여기서는 1번 그림으로 axis를 설명할 예정입니다.

axis 0 접근 시 axis 0 방향성에 해당하는 '배열'을 가져옵니다.

0번 '행'과 1번 '행'의 값을 각각 출력합니다.
print('arr[0]: ', arr[0])
print('arr[1]: ', arr[1])

# 출력
# arr[0]:  [1 2 3 4]
# arr[1]:  [5 6 7 8]

axis 1에 접근할 때는 axis 0(행), axis 1(열) 순서로 접근하여 값을 가져옵니다.

0번 '행', 1번 '열' 순서로 접근한 값을 출력합니다.
print('arr[0][1]: ', arr[0][1])

# 출력
# arr[0][1]:  2

1번 '행', 3번 '열' 순서로 접근한 값을 출력합니다.
print('arr[1][3]: 'arr[1][3])

# 출력
# arr[1][3]:  8

3. numpy에서 사용하는 axis 구조 (3차원)

arr = np.array([[[1234][5678]], 
                          [[9101112][13141516]], 
                          [[17181920][21222324]]])
print('arr.shape: 'arr.shape)

# 출력
# arr.shape:  (3, 2, 4)
(3, 2, 4)는 3차원의 데이터로 총 24개(3*2*4)의 데이터를 가지고 있음을 나타냅니다.

3차원 배열은 (depth, 행, 열) or (행, 열, depth) 구조로 표현하는데, numpy는 (depth, 행, 열)로 구성되어 있습니다.

3차원 배열 shape axis 순서


3차원 배열도 동일하게 axis를 구상하는 방식에 따라 '표현'의 차이가 있을 수 있습니다.
Ex.
axis의 차이일 뿐 모두 '같은 내용을 그림 상 다르게 표현'한 것이며, 여기서는 1번 그림으로 axis를 설명할 예정입니다.
※ 1번, 2번 전체 구조 데이터 그림은 맨 하단에 첨부했으니, 필요하신 분은 참고하세요.

3차원 배열 numpy는 axis 0 접근 시 'depth'에 접근하여 '배열'을 가져옵니다.

axis 0에 접근할 때, 'depth'에 접근하는 걸 확인할 수 있습니다.
print('arr[0]: ', arr[0])
print('arr[1]: ', arr[1])
print('arr[2]: ', arr[2])

# 출력
# arr[0]:  [[1 2 3 4]
#              [5 6 7 8]]
# arr[1]:  [[ 9 10 11 12]
#              [13 14 15 16]]
# arr[2]:  [[17 18 19 20]
#              [21 22 23 24]]


axis 1에 접근할 때는 axis 0(depth), axis 1(행) 순서로 접근하여 값을 가져옵니다.

0번 'depth', 1번 '행' 순서로 접근한 값을 출력합니다.
print('arr[0][1]: 'arr[0][1])

# 출력
# arr[0][1]:  [5 6 7 8]

1번 'depth', 0번 '행' 순서로 접근한 값을 출력합니다.
print('arr[1][0]: 'arr[1][0])

# 출력
# arr[1][0]:  [ 9 10 11 12]


axis 2에 접근할 때는 axis 0(depth), axis 1(행), axis 2(열) 순서로 접근하는 걸 확인할 수 있습니다.

0번 'depth', 1번 '행', 2번 '열' 순서로 접근한 값을 출력합니다.
print('arr[0][1][2]: ', arr[0][1][2])

# 출력
# arr[0][1][2]:  7

2번 'depth', 0번 '행', 1번 '열' 순서로 접근한 값을 출력합니다.
print('arr[2][0][1]: 'arr[2][0][1])

# 출력
# arr[2][0][1]:  18

이렇게 axis의 구조를 알아봤습니다.

이해가 안가거나 잘못된 정보는 댓글 부탁드립니다.

참고문헌

[1] https://www.pythoninformer.com/python-libraries/numpy/index-and-slice/


3차원 1번, 2번 데이터 구조



댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)

[python] selenium close와 quit 차이점