- 공유 링크 만들기
- 이메일
- 기타 앱
배열 객체들의 결합(concatenate)
관련된 내용
두 개이상의 배열객체를 결합하여 단일한 배열 객체로 만들 수 있습니다. 배열 객체는 차원에 따라 형태가 달라집니다. 그러므로 같은 형태의 배열들 사이에서 결합이 이루어지며 결합의 기준이 되는 차원(축)을 지정해야 됩니다. 예를 들어 2×3, 2×3의 형태를 지닌 두 배열의 결합에서 첫번째 축-0번째 인덱스-을 기준으로 하면 결합된 형태는 4×6됩니다.
다음의 함수들은 두 배열 객체를 결합하기 위해 사용하는 것으로 특히 1,2 차원의 배열들의 결합에 적용됩니다(stack 함수참조).
- np.vstack([x,y,...])
- 배열 형태의 0번째 인덱스가 수정되는 방향으로 결합, 즉 수직적(행방향)으로 연결
- 인수는 리스트 형식으로 전달
- hstack([x,y,...])
- 배열 형태의 1번째 인덱스가 수정되는 방향으로 결합, 즉 수평적(열방향)으로 연결
- 인수는 리스트 형식으로 전달
np.random.seed(1) a1=np.random.randint(10, size=(3)) b1=np.random.randint(10, size=(3)) print(f"shape of a1: {a1.shape}\nshape of b1: {b1.shape}")
shape of a1: (3,) shape of b1: (3,)
위 객체 a1, b1은 벡터입니다. 두 벡터를 행단위로 결합하면 2행이 되며 열단위로 결합하면 여전히 벡터가 됩니다.
ab1v=np.vstack([a1,b1]) ab1h=np.hstack([a1, b1]) print(f"shape of ab1v: {ab1v.shape}\nshape of ab1h: {ab1h.shape}")
shape of ab1v: (2, 3) shape of ab1h: (6,)
행렬의 경우 역시 마찬가지 입니다. 행단위 결합은 차원의 첫번째 인덱스, 열단위 결합으로 두번째 인덱스가 변화됩니다.
np.random.seed(1) a=np.random.randint(10, size=(2,3)) b=np.random.randint(10, size=(2,3)) print(f"shape of a: {a.shape}\nshape of b: {b.shape}")
shape of a: (2, 3) shape of b: (2, 3)
abv=np.vstack([a,b]) abh=np.hstack([a,b]) print(f"shape of abv: {abv.shape}\nshape of abh: {abh.shape}")
shape of abv: (4, 3) shape of abh: (2, 6)
다음 객체 c, d는 3차원입니다. 그러나 위 두 함수는 행, 열방향의 변화만을 유도하므로 3차원 이상의 객체의 결합 역시 차원 인덱스의 첫번째와 두번째의 변화만을 유도합니다.
np.random.seed(1) c=np.random.randint(10, size=(2,3,2)) d=np.random.randint(10, size=(2,3,2)) print(f"shape of c: {c.shape}\nshape of d: {d.shape}")
shape of c: (2, 3, 2) shape of d: (2, 3, 2)
cdv=np.vstack([c,d]) cdh=np.hstack([c,d]) print(f"shape of cdv: {cdv.shape}\nshape of cdh: {cdh.shape}")
shape of cdv: (4, 3, 2) shape of cdh: (2, 6, 2)
np.r_[], np.c_[]는 위 함수들과 같이 두개 이상의 행렬을 결합할 경우 적용합니다. 그러나 전달되는 객체가 벡터일 경우 행렬로 인식합니다.
- np.r_[x,y,...]: 객체의 1차원을 증가시키는 방향으로 결합
- 벡터의 형태 3,은 (3, 0)으로 행렬로 인식 : (3,0) + (3, 0) → (6, 0)=(6,)
- (2,3) 형태의 행렬인 경우 : (2,3) + (2,3) → (4,3)
- np.c_[x,y,...]: 객체의 2차원을 증가시키는 방향으로 결합
- 벡터의 형태 3,은 (3, 1) 형태의 행렬로 인식 : (3,1) + (3, 1) → (3, 2)
- (2,3) 형태의 행렬인 경우 : (2,3) + (2,3) → (2, 6)
np.random.seed(1) c1=np.random.randint(10, size=(3))
np.r_[a1,b1].shape, np.r_[a1, b1, c1].shape
((6,), (9,))
np.r_[a,b].shape
(4, 3)
np.c_[a1,b1].shape, np.c_[a1, b1, c1].shape
((3, 2), (3, 3))
np.c_[a,b].shape
(2, 6)
위에서 소개한 함수들은 1, 2 차원의 객체가 대상입니다. np.concatenate([x, y, …], axis=0)
은 결합하는 객체들의 축(axis)을 지정함으로서 직관적으로 결합객체를 생성할 수 있습니다. 그러므로 3차원이상의 객체 역시 대상이 됩니다(concatenate 함수참조).
이 함수의 인수 axis는 전달하는 객체의 형태 인덱스와 연결됩니다. 그러므로 전달하는 객체가 1차원이라면 형태의 인덱스는 0만 존재합니다. 그러므로 인수 axis에 전달할 수 있는 값은 0만 존재합니다. 또한 음의 정수가 axis의 인수값으로 전달 할 수 있습니다. 이것은 음의 정수는 역인덱스를 의미합니다(인덱스와 슬라이싱(Index & Slicing)참조).
np.concatenate([a1, b1], axis=0).shape
(6,)
np.concatenate([a1, b1], axis=-1).shape
(6,)
np.concatenate([a1, b1], axis=1).shape
AxisError: axis 1 is out of bounds for array of dimension 1
print(np.concatenate([a, b], axis=0).shape) print(np.concatenate([a, b], axis=1).shape) print(np.concatenate([a, b], axis=-1).shape)
(4, 3) (2, 6) (2, 6)
print(np.concatenate([c, d], axis=0).shape) print(np.concatenate([c, d], axis=1).shape) print(np.concatenate([c, d], axis=2).shape)
(4, 3, 2) (2, 6, 2) (2, 3, 4)
print(np.concatenate([c, d], axis=-3).shape) print(np.concatenate([c, d], axis=-2).shape) print(np.concatenate([c, d], axis=-1).shape)
(4, 3, 2) (2, 6, 2) (2, 3, 4)
함수 np.dstack((x, y, ...))
는 두개 이상의 배열들을 사용하여 최대 3차원배열을 생성합니다.
- 1, 2차원 배열들에 각각 새로운 축을 첨가하여 3차원으로 변환
- 마지막 차원 인덱스 사이에서 변화가 일어납니다.
- (3,)→(1,3,1), (1,3,1)+(1,3,1)=(1,3,2)
- (2,3)→(2,3,1), (2,3,1)+(2,3,1)=(2,3,2)
a=[5, 8, 9], b=[5, 0, 0]는 (3,) 형태인 벡터입니다. 이 함수에 의해 벡터들은 다음과 같이 결합됩니다.
$$\begin{bmatrix} 5\\8\\9\end{bmatrix}+\begin{bmatrix} 5\\0\\0\end{bmatrix}=\begin{bmatrix}\begin{bmatrix}5&0\\8&0\\9&0\end{bmatrix}\end{bmatrix}$$
a1b1ds=np.dstack((a1, b1)) print(a1b1ds, a1b1ds.shape)
[[[5 5] [8 0] [9 0]]] (1, 3, 2)
abds=np.dstack((a, b)) print(abds, abds.shape)
[[[9 2] [2 4] [4 7]] [[5 7] [2 9] [4 1]]] (2, 3, 2)
cdds=np.dstack((c, d)) print(cdds, cdds.shape)
[[[7 0 8 3] [6 9 9 8] [9 7 7 3]] [[6 9 6 5] [1 0 1 9] [1 8 3 4]]] (2, 3, 4)
댓글
댓글 쓰기