기록하는 습관

[Numpy] 005. 배열 붙이기 (Concatenate) 본문

Python/Numpy

[Numpy] 005. 배열 붙이기 (Concatenate)

Avalla 2023. 8. 7. 00:50

배열 붙이기 (Concatenate)

import numpy as np

 

np.concatenate()

Docstring:

concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")

Join a sequence of arrays along an existing axis.

가장 간단해 보이는 concat 함수이지만 차원과 shape을 신경써서 써야 한다.

a = np.array([1,2,3])
b = np.concatenate((a,a), axis=0)
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[1 2 3]
shape : (3,) ndim : 1
[1 2 3 1 2 3]
shape : (6,) ndim : 1
a = np.array([[1,2]])
b = np.concatenate([a,a], axis=0)
c = np.concatenate((a,a), axis=1)
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
print( c )
print( "shape :", c.shape, "ndim :", c.ndim )
[[1 2]]
shape : (1, 2) ndim : 2
[[1 2]
 [1 2]]
shape : (2, 2) ndim : 2
[[1 2 1 2]]
shape : (1, 4) ndim : 2

아래와 같이 1차원 벡터에 2차원 축으로 붙이려는 경우 에러가 발생

a = np.array([1,2,3])
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
b = np.concatenate((a,a), axis=1)
[1 2 3]
shape : (3,) ndim : 1



---------------------------------------------------------------------------

AxisError                                 Traceback (most recent call last)

<ipython-input-5-a3ba8329f4a1> in <module>
      2 print( a )
      3 print( "shape :", a.shape, "ndim :", a.ndim )
----> 4 b = np.concatenate((a,a), axis=1)


<__array_function__ internals> in concatenate(*args, **kwargs)


AxisError: axis 1 is out of bounds for array of dimension 1

다음과 같이 2차원으로 임베딩이 필요하다.

a = np.array([[1,2,3]])
b = np.concatenate((a,a), axis=1)
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[[1 2 3]]
shape : (1, 3) ndim : 2
[[1 2 3 1 2 3]]
shape : (1, 6) ndim : 2

concat 하려는 축 외의 차원 shape이 동일해야 작용한다.

a = np.array(range(12)).reshape(2,2,3)
b = np.array(range(6)).reshape(1,2,3)
c = np.concatenate((a,b), axis=0)
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
print( c )
print( "shape :", c.shape, "ndim :", c.ndim )
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
shape : (2, 2, 3) ndim : 3
[[[0 1 2]
  [3 4 5]]]
shape : (1, 2, 3) ndim : 3
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]

 [[ 0  1  2]
  [ 3  4  5]]]
shape : (3, 2, 3) ndim : 3
a = np.array(range(12)).reshape(2,2,3)
b = np.array(range(8)).reshape(2,2,2)
c = np.concatenate((a,b), axis=2)
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
print( c )
print( "shape :", c.shape, "ndim :", c.ndim )
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
shape : (2, 2, 3) ndim : 3
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
shape : (2, 2, 2) ndim : 3
[[[ 0  1  2  0  1]
  [ 3  4  5  2  3]]

 [[ 6  7  8  4  5]
  [ 9 10 11  6  7]]]
shape : (2, 2, 5) ndim : 3

 

np.hstack(tup)

Signature: np.hstack(tup)

Docstring:

Stack arrays in sequence horizontally (column wise).

This is equivalent to concatenation along the second axis, except for 1-D
arrays where it concatenates along the first axis. Rebuilds arrays divided
by hsplit.

a = np.array([1,2,3])
b = np.hstack((a,a)) # np.concatenate([a,a], axis=0) 같은 동작
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[1 2 3]
shape : (3,) ndim : 1
[1 2 3 1 2 3]
shape : (6,) ndim : 1
a = np.array([[1,2,3],[4,5,6]])
b = np.hstack((a,a))
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[[1 2 3]
 [4 5 6]]
shape : (2, 3) ndim : 2
[[1 2 3 1 2 3]
 [4 5 6 4 5 6]]
shape : (2, 6) ndim : 2

 

np.vstack(tup)

Signature: np.vstack(tup)

Docstring:

Stack arrays in sequence vertically (row wise).

This is equivalent to concatenation along the first axis after 1-D arrays
of shape (N,) have been reshaped to (1,N). Rebuilds arrays divided by
vsplit.

np.vstack()의 경우 차원을 자동으로 증가시켜준다.

a = np.array([1,2])
b = np.vstack((a,a)) 
# np.concatenate(([[1,2]], [[1,2]]), axis=0)와 같은 역할로, concat 함수를 쓰려면 shape 변형이 필요
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[1 2]
shape : (2,) ndim : 1
[[1 2]
 [1 2]]
shape : (2, 2) ndim : 2
a = np.array([[1,2,3],[4,5,6]])
b = np.vstack((a,a))
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[[1 2 3]
 [4 5 6]]
shape : (2, 3) ndim : 2
[[1 2 3]
 [4 5 6]
 [1 2 3]
 [4 5 6]]
shape : (4, 3) ndim : 2

 

np.vstack()과 np.hstack()은 3차원 이상의 배열에서도 사용할 수 있지만, 특정 축을 따라 연결하려는 복잡한 경우에는 더 일반적인 np.concatenate() 함수가 유용하다.

a = np.array(range(6)).reshape(1,2,3)
b = np.vstack((a,a))
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[[[0 1 2]
  [3 4 5]]]
shape : (1, 2, 3) ndim : 3
[[[0 1 2]
  [3 4 5]]

 [[0 1 2]
  [3 4 5]]]
shape : (2, 2, 3) ndim : 3
a = np.array(range(6)).reshape(1,2,3)
b = np.hstack((a,a))
print( a )
print( "shape :", a.shape, "ndim :", a.ndim )
print( b )
print( "shape :", b.shape, "ndim :", b.ndim )
[[[0 1 2]
  [3 4 5]]]
shape : (1, 2, 3) ndim : 3
[[[0 1 2]
  [3 4 5]
  [0 1 2]
  [3 4 5]]]
shape : (1, 4, 3) ndim : 3