build my life

[Python] Numpy (4) axis 이해 / 배열 차원 변경 / 배열 합치기 본문

Python

[Python] Numpy (4) axis 이해 / 배열 차원 변경 / 배열 합치기

dalovee 2022. 8. 31. 17:54
728x90

1. axis : 배열의 축

axis, 축의 개념은 배열 안에서 연산이 일어나거나 배열을 합치거나 할 때 기준이 된다.

1, 2차원의 축은 이해가 된다. 학창시절... 함수 그래프를 그릴 때 기계처럼 x축, y축을 그렸던...ㅋㅋㅋ

즉, 1차원은 축이 1개, 2차원은 2개, 3차원은 3개 점점 축이 하나씩 생기는 걸 알 수 있다.

2. 배열 차원 변경(reshape)

- reshape을 사용하면 배열의 차원을 바꿀 수 있다.

 

먼저, 1차원 배열인 arr가 있다고 가정해보자

arr = np.array([0,1,2,3,4,5]) #1차원배열
arr.shape # (6,)

1차원 -> 2차원

- 1차원 배열 arr를 2차원 배열인 행렬로 바꿔보자. ex) (6,) -> (2 ,3) 

arr.reshape(2,3)
#[[0 1 2]
# [3 4 5]]

np.reshape(arr, [2,3])
# 이렇게 사용할 수도 있다~

=> 간단하게 reshape를 써서 차원을 변경해 1차원 배열을 2차원 배열로 변경할 수 있다.

 

+) 차원 추가하는 방법

1. np.newaxis 사용

arr[:,np.newaxis]

"""
[[0]
 [1]
 [2]
 [3]
 [4]
 [5]]
"""

=> newaxis를 사용하여 차원을 추가할 수 있다. 이 경우 arr.shape => (6, 1)로

arr[ : , np.newaxis] == arr.reshape(-1,1)

 

여기서 reshape의 첫번째 인자값 -1은 모든 요소를 다 사용한다는 의미(=flatten) 이며 두번째 인자값에 숫자가 들어가면 차원을 추가한다는 의미!

❓ 만약, 두번째 인자값이 1이 아닌 2가 들어간다면?

arr.reshape(-1,2)
"""
[[0 1]
 [2 3]
 [4 5]]
"""

=> (3, 2)인 행렬이 반환된다!

즉, reshape의 첫번째 인자값이 -1이라는 말은 모든 요소를 flatten 시키고, 두번째 인자값에 값이 들어가면 차원을 추가하겠다! 그리고 들어간 값 만큼 요소를 묶어 추가한 차원 안에 넣겠다!

+) 3차원으로 배열의 차원을 변경해주려면 세번째 인자값을 추가하면 된다^_^

 

2. np.expand_dims 사용

arr = np.array([0,1,2,3,4,5])

np.expand_dims(arr, axis=0)
# [[0,1,2,3,4,5]]
# (1, 6)

np.expand_dims(arr, axis=1)
# [[0],[1],[2],[3],[4],[5]]
# (6, 1)

=> axis에 따라 shape이 달라진다. arr가 1차원배열이니 axis = 0 이면 행방향으로 차원이 추가된다.

axis = 1 이면 열방향으로 차원이 추가된다.

 

2차원 -> 3차원

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

arr3 = arr.reshape(-1, 1, 3)
# (3, 1, 3)
"""
[[[1 2 3]]

 [[4 5 6]]

 [[7 8 9]]]
"""

=> reshape 첫 번째 인자값 -1은 기존 2차원 배열인 arr를 1차원 배열로 만들어 준다는 의미

그 뒤에 2, 3번째 인자값은 1차원 배열 안 요소를 1행 3열인 2차원 배열로 만들어 추가해준다는 의미!

 

이렇게 reshape를 이용해서 차원을 변경 또는 추가할 수 있다!

전치(transpose)

- 행과 열을 바꾼다.

arr = np.array([
	[ 1 , 2 ],
    [ 3 , 4 ],
    [ 5 , 6 ]
])

np.transpose(arr) / arr.T / arr.transpose()
"""
[[ 1 , 3 , 5 ],
 [ 2 , 4 , 6 ]]
"""

3차원 데이터도 전치가 가능할까?! 물론 가능하다!

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

    [
        [10,11,12],
        [13,14,15],
        [16,17,18]
    ]
])

# 인자값이 없을 경우
arr.transpose()
"""
[[[ 1 10]
  [ 4 13]
  [ 7 16]]

 [[ 2 11]
  [ 5 14]
  [ 8 17]]

 [[ 3 12]
  [ 6 15]
  [ 9 18]]]
"""

# 인자값이 주어질 경우
arr.transpose(0,2,1)
"""
[[[ 1  4  7]
  [ 2  5  8]
  [ 3  6  9]]

 [[10 13 16]
  [11 14 17]
  [12 15 18]]]
"""

=> 인자값으로는 axis의 번호가 들어간다. (0, 2, 1)은 axis = 1 이랑 axis = 2랑 바꾼다는 것이다.

인자값이 아무것도 주어지지 않는 경우는 (2,1,0) 인 것이다. 즉, 모든 축이 다 바뀐다.

 

flatten 함수

- 다차원 배열을 1차원 배열로 만든다.

arr.flatten()

==> arr.resahpe(-1)

squeeze 함수

- axis = 1인 차원 제거

> 이거 정말 이해 안된다아ㅏㅏㅏㅏㅏㅏㅏㅏ 다 시 공 부 해

 

3. 배열 병합

1) concatenate 함수

- axis 방향으로 배열 병합

arr1 = np.array([
    [1,2],
    [3,4],
    [5,6]
])

arr2 = np.array([
    [10,20]
])

arr3 = np.array([
    [10],
    [20],
    [30]
])



np.concatenate((arr1,arr2))
# [[ 1,  2],
#  [ 3,  4],
#  [ 5,  6],
#  [10, 20]]


np.concatenate((arr1,arr3), axis=1)
# [[ 1,  2, 10],
#  [ 3,  4, 20],
#  [ 5,  6, 30]]

=> axis 를 지정해주지 않으면 아래 방향으로 병합하고 axis를 지정해주면 지정해준 축을 기준으로 병합한다.

=> axis 축을 기준으로 병합할 경우 요소의 개수가 일치해야한다.

2) stack 함수

- 합치려는 차원의 크기가 모두 동일해야함

- 합치려는 배열을 하나의 행으로 취급

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

arr2 = np.array([
    [10,20,30],
    [5,2,3],
    [60,70,80]
])

np.stack((arr1, arr2))
#[[[ 1,  2,  5],
#  [ 3,  4,  6],
#  [ 5,  6,  9]],
# [[10, 20, 30],
#  [ 5,  2,  3],
#  [60, 70, 80]]]

=> 각 배열이 하나의 행으로 취급해 합친다.

 

 

 

 

 

728x90