numpy에서 제공되는 클래스인 c_와 r_은 입력받은 ndarray를 결합하여 새로운 ndarray를 빠르게 생성할 수 있도록 도와줍니다.
이 때, c_와 r_은 ()이 아닌 []을 통해 ndarray를 입력받습니다.
1. r_
c_를 이해하기 위해서는 r_ 클래스를 먼저 이해해야 합니다.
class CClass(AxisConcatenator):
"""
Translates slice objects to concatenation along the second axis.
This is short-hand for ``np.r_['-1,2,0', index expression]``, which is
useful because of its common occurrence. In particular, arrays will be
stacked along their last axis after being upgraded to at least 2-D with
1's post-pended to the shape (column vectors made out of 1-D arrays)
numpy의 공식문서를 보면 c_는 r_의 첫번째 인자로 '-1, 2, 0'을 전달한 것과 동일합니다.
r_의 첫번째 인자는 문자열로된 ", "으로 구분된 정수를 3개까지 받을 수 있습니다.
ex) "0, 1", "1, 3, 0", "-1, 2, 0" ...
각각의 인자가 의미하는 것을 하나씩 살펴보겠습니다.
1) 첫번째 인자는 합칠 axis를 나타냅니다.
# 1-d ndarray
import numpy as np
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
np.r_['0', A, B] # array([1, 2, 3, 4, 5, 6])
np.r_['1', A, B] # AxisError
2개의 1-d ndarray를 합쳐 1-d ndarray를 만들 수 있습니다. 축이 하나뿐이기 때문에 '0'을 전달하면 1차원 축으로 합쳐집니다. 또 축이 하나뿐이기 때문에 0 이외의 값을 사용하면 AxisError가 일어나게 됩니다.
# 2-d ndarray
import numpy as np
A = np.array([[1, 2, 3]])
B = np.array([[4, 5, 6]])
np.r_['0', A, B]
# array([[1, 2, 3],
# [4, 5, 6]])
np.r_['1', A, B]
# array([[1, 2, 3, 4, 5, 6]])
2-d ndarray를 합치면 2차원 ndarray를 반환합니다. '0'을 전달하면 2차원 축으로 합쳐지고, '1'을 전달하면 1차원 축으로 합쳐집니다.
# 3-d ndarray
import numpy as np
A = np.array([[[1, 2, 3]]])
B = np.array([[[4, 5, 6]]])
np.r_['0', A, B]
# array([[[1, 2, 3]],
# [[4, 5, 6]]])
np.r_['1', A, B]
# array([[[1, 2, 3],
# [4, 5, 6]]])
np.r_['2', A, B]
# array([[[1, 2, 3, 4, 5, 6]]])
3-d ndarray도 마찬가지로 '0'을 전달하면 3차원 축으로 합쳐지고, '1'을 전달하면 2차원, '2'를 전달하면 1차원 축으로 합쳐집니다.
2) 두번째 인자는 반환한 ndarray의 차원을 결정합니다.
import numpy as np
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
np.r_['0, 1', A, B]
# array([1, 2, 3, 4, 5, 6])
# 1-d ndarray를 반환
np.r_['0, 2', A, B]
# array([[1, 2, 3],
# [4, 5, 6]])
# 2-d ndarray를 반환
np.r_['1, 2', A, B]
# array([[1, 2, 3, 4, 5, 6]])
# 2-d ndarray를 반환
np.r_['0, 3', A, B]
# array([[[1, 2, 3]],
# [[4, 5, 6]])
# 3-d ndarray를 반환
np.r_['1, 3', A, B]
# array([[[1, 2, 3],
# [4, 5, 6]]])
# 3-d ndarray를 반환
np.r_['2, 3', A, B]
# array([[[1, 2, 3, 4, 5, 6]]])
# 3-d ndarray를 반환
첫번째 인자는 동일하게 합칠 축을 결정합니다. 두번째 인자는 합쳐진 ndarray들의 차원을 결정합니다.
합치는 ndarray들(인자로 입력받는)은 서로 동일한 차원을 갖고 있어야 합니다.
또한 입력받는 ndarray보다 작은 차원을 반환할 수는 없습니다. (반환되는 ndarray의 차원은 입력되는 ndarray의 차원 이상이어야 함)
# 3-d ndarray를 입력받는 경우 반환값은 3-d ndarray가 됩니다
A = np.array([[[1, 2, 3]]])
B = np.array([[[4, 5, 6]]])
print(np.r_['2, 1', A, B])
# array([[[1, 2, 3, 4, 5, 6]]])
# 1-d ndarray를 반환하고 싶지만 3-d ndarray가 반환됨
3) 세번째 인자는 ndarray를 어떻게 합칠지를 결정합니다.
사실 이 부분이 많이 헷갈리는데 대부분 2-d ndarray를 사용하기 때문에 2-d ndarray에 중점을 두고 살펴보겠습니다.
세번째 인자는 두 번째 인자인 "반환하는 ndarray의 차원"이 입력받은 ndarray의 차원보다 높은 경우에만 의미가 있습니다.
import numpy as np
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
np.r_['0, 2', A, B]
# array([[1, 2, 3],
# [4, 5, 6]])
np.r_['0, 2, 0', A, B]
# array([[1],
# [2],
# [3],
# [4],
# [5],
# [6]])
np.r_['0, 2, 1', A, B]
# array([[1, 2, 3],
# [4, 5, 6]])
np.r_['1, 2', A, B]
# array([[1, 2, 3, 4, 5, 6]])
np.r_['1, 2, 0', A, B]
# array([[1, 4],
# [2, 5],
# [3, 6]])
np.r_['1, 2, 1', A, B]
# array([[1, 2, 3, 4, 5, 6]])
3번째 인자의 값에 '1'이 전달되는 경우 원래 입력받은 ndarray 그대로 합쳐집니다. 하지만 '0'으로 받게 되면 입력받은 ndarray를 마치 열벡터처럼 변환한 후에 합치는 연산을 수행합니다.
2. c_
class CClass(AxisConcatenator):
"""
Translates slice objects to concatenation along the second axis.
This is short-hand for ``np.r_['-1,2,0', index expression]``, which is
useful because of its common occurrence. In particular, arrays will be
stacked along their last axis after being upgraded to at least 2-D with
1's post-pended to the shape (column vectors made out of 1-D arrays)
처음 글을 시작할 때 np.c_는 np.r_의 첫번째 인자로 '-1, 2, 0'을 입력하였을 때의 결과와 동일하다 하였습니다.
-1은 가장 큰 값을 나타내는 default값입니다. 반환하는 ndarray가 2-d이므로 첫번째 인자가 될 수 있는 가장 큰 값은 1이 됩니다. 세번째 인자로 '0'이 전달되었으므로 입력받은 ndarray들은 열벡터와 같이 전달됩니다.
따라서 ndarray A와 B가 주어질 때, np.c_의 결과값은 np.r_[1, 2, 0, A, B]와 동일하게 됩니다.
import numpy as np
np.c_[np.array([1, 2, 3]), np.array([4, 5, 6])]
3. column_stack
column_stack은 c_와 동일하게 ndarray들이 주어질 때, 열벡터로써 ndarray들을 합쳐 2-d ndarray를 반환합니다.
c_와 다르게 column_stack은 1) 함수처럼 "( )"을 통해 인자를 입력받고, 입력받는 ndarray들을 튜플로 묶어 입력받습니다.
import numpy as np
A = [1, 2, 3]
B = [4, 5, 6]
C = [7, 8, 9]
print(np.column_stack((A, B, C)))
'Python > Syntax' 카테고리의 다른 글
[Pandas] read_csv에서 index_col 삭제 (0) | 2022.08.19 |
---|---|
[JupyterNoteBook] 사용자 정의 ipynb 파일 임포트 (다른 ipynb 파일 임포트) (0) | 2022.07.29 |
[Python] random 모듈 (0) | 2022.07.18 |
[Python] slice 클래스 (0) | 2022.07.16 |
[Pandas] 행에서 문자열, 값의 검색 (0) | 2022.07.15 |