4.6.9 np.r_[]
① np.r_[] 개요
[실전 꿀팁]: 마법의 단축키 np.r_ (Row-wise 옆으로 잇기)
1차원 배열들을 옆으로 나란히 쭉 이어서 하나의 긴 1차원 배열로 만들 때 쓰는 마법의 단축키입니다. Row 혹은 Right(오른쪽으로 이어 붙임)로 외우면 쉽습니다. np.hstack이나 concatenate 대용으로 코드를 짧게 짤 때 매우 유용합니다.
numpy.r_[]은 함수를 이용하여 호출하는 것이 아니라 연산자 []를 이용한다. numpy.r_[]은 수평으로 또는 수직으로도 합칠 수 있는 다양한 결합 방법을 제공한다.
다음 모양 (3, )의 1차원 배열 a와 b가 있다.
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
다음 코드로 간단히 1차원 배열(벡터)을 수평으로 합칠 수 있다. 즉 1차원 벡터들을 나열하여 행으로 붙인다. 혹시 2차원이라도 기본적으로 인자인 슬라이스 객체를 첫 번째 축(axis=0)을 따라 연결해 변환(Translates slice objects to concatenation along the first axis)한다.
np.r_[a, b]
출력:
array([1, 2, 3, 4, 5, 6])
이미 배웠던 np.hstack((a, b))와 결과가 같다.
np.hstack((a, b))
출력:
array([1, 2, 3, 4, 5, 6])
그러나 이미 배운 np.row_stack((a, b))와는 결과가 다르다.
np.row_stack((a, b))
출력:
array([[1, 2, 3],
[4, 5, 6]])
다음 코드는 배열 a, b와 함께 정수 리터럴 0이 2개가 있는 1차원 배열이 반환된다.
np.r_[a, 0, 0, b]
출력:
array([1, 2, 3, 0, 0, 4, 5, 6])
다음 3:10:3은 np.arange(start, stop, step)에서의 start=3, stop=10, step=3을 의미한다. 그러므로 시퀀스 [3, 6, 9]를 의미한다. 그러므로 다음 결과가 표시된다.
np.r_[3:10:3, [0]*2, 5, 6]
출력:
array([3, 6, 9, 0, 0, 5, 6])
다음 코드에서 -1:1:6j는 np.linspace(start, stop, num)에서의 start=-1, stop=1, num=6을 의미한다. 그러므로 시퀀스 [-1, -0.6, -0.2, 0.2, 0.6, 1]을 의미한다. 그러므로 다음 결과가 표시된다.
np.r_[-1:1:6j, [0]*2, 5, 6]
출력:
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 0. , 0. , 5. , 6. ])
즉 np.linspace(-1, 1, 6)으로는 [-1, 1](-1에서 1사이, 끝수 1 포함) 사이에서 실수 6개로 등분하는 실수 시퀀스가 반환된다.
np.linspace(-1, 1, 6)
출력:
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. ])
② np.r_[‘i, j, k’, a, b]
다음 모양 (2, 3)의 2차원 배열 a가 있다.
a = np.array([[0, 1, 2], [3, 4, 5]])
a
출력:
array([[0, 1, 2],
[3, 4, 5]])
다음 코드의 결과는 첫 축인 축 0 방향으로 쌓는다. 즉, 수직으로 배열 a를 3개 쌓아 합친다.
np.r_[a, a, a] # concatenate along first axis
출력:
array([[0, 1, 2],
[3, 4, 5],
[0, 1, 2],
[3, 4, 5],
[0, 1, 2],
[3, 4, 5]])
다음 np.r_['0', a, a]처럼 첫 인자는 정수 문자열이 위치할 수 있다. 가장 앞 인자인 정수 문자에서 첫 숫자는 합쳐지는 축을 지정한다. 다음 np.r_['0', a, a]은 배열 a 2개를 첫 축인 축 0으로 합친다.
np.r_['0', a, a] # concatenate along first axis
출력:
array([[0, 1, 2],
[3, 4, 5],
[0, 1, 2],
[3, 4, 5]])
다음 np.r_['1', a, a]로는 배열 a 2개를 마지막 축인 축 1로 합친 결과를 얻는다.
np.r_['-1', a, a] # concatenate along last axis
출력:
array([[0, 1, 2, 0, 1, 2],
[3, 4, 5, 3, 4, 5]])
다음처럼 np.r_['1', a, a]로도 위와 같은 결과를 얻는다.
np.r_['1', a, a] # concatenate along last axis
출력:
array([[0, 1, 2, 0, 1, 2],
[3, 4, 5, 3, 4, 5]])
문자열 인자는 여러 개의 숫자로 구분된 문자열에 따라 쌓을 축을 지정한다. 쉼표로 구분된 두 개의 정수로 구성된 문자열을 사용하면 각 항목을 두 번째 정수로 입력할 최소 차원을 강제로 표시할 수 있다. 즉, 두 번째 인자는 합칠 배열의 확장할 차원(minimum dimension)을 말한다.
다음 코드로는 축 0으로 합치며, 최종 2차원의 배열이 된다.
np.r_['0, 2', [1,2,3], [4,5,6]] # concatenate along first axis, dim>=2
출력:
array([[1, 2, 3],
[4, 5, 6]])
다음 코드로는 축 0으로 합치며, 최종 3차원의 배열이 된다.
np.r_['0, 3', [1,2,3], [4,5,6]] # concatenate along first axis, dim>=3
출력:
array([[[1, 2, 3]],
[[4, 5, 6]]])
정수 문자열 내부에서 두 번째 인자에 따라 차원을 확장하는 과정에서 세 번째 인자가 필요하다. 예를 들어 1차원 (3, )을 3차원으로 확장하는 경우, 모양 (1, 1, 3)으로 확장할 지, (1, 3, 1)로 확장할지, 아니면 (3, 1, 1)로 확장할지를 정해주는 인자이다.
다음 코드의 '0, 3, 0'은 세 번째 정수가 0으로 확장 방법이 (3, 1, 1)로 확장한다. 즉 [1, 2, 3]과 [4, 5, 6]을 각각 (3, 1, 1)로 확장해 축 0 방향(수직 방향으로)으로 쌓는다.
np.r_['0, 3, 0', [1,2,3], [4,5,6]]
출력:
array([[[1]],
[[2]],
[[3]],
[[4]],
[[5]],
[[6]]])
위 결과의 모양이 (6, 1, 1)임을 알 수 있다.
np.r_['0, 3, 0', [1,2,3], [4,5,6]].shape
출력:
(6, 1, 1)
다음 코드의 '0, 3, 1'은 세 번째 정수가 1로 확장 방법이 (1, 3, 1)로 확장한다.
np.r_['0, 3, 1', [1,2,3], [4,5,6]]
출력:
array([[[1],
[2],
[3]],
[[4],
[5],
[6]]])
위 결과의 모양이 (2, 3, 1)임을 알 수 있다.
np.r_['0, 3, 1', [1, 2, 3], [4,5,6]].shape
출력:
(2, 3, 1)
다음 코드의 '0, 3, 2'는 세 번째 정수가 2로 확장 방법이 (1, 1, 3)으로 확장한다.
np.r_['0, 3, 2', [1,2,3], [4,5,6]]
출력:
array([[[1, 2, 3]],
[[4, 5, 6]]])
위 결과의 모양이 (2, 1, 3)임을 알 수 있다.