관리 메뉴

FU11M00N

[ Numpy ] numpy 변환 (append, concatenate, c_, r_ , swap, flip) 본문

AI/Numpy

[ Numpy ] numpy 변환 (append, concatenate, c_, r_ , swap, flip)

호IT 2021. 3. 29. 11:43
import numpy as np
import matplotlib.pyplot as plt

 

- 변환 

 

reshape 가 배열의 순서를 유지하는 상태에서 배열의 형태만 유지한다면 아예 새로운 배열로 변환하는 방법이 있습니다.

 

- append

np.append 는 두개의 1차원 배열을 합칠 수 있습니다.

np.append( 배열1, 배열2 )

다차원 배열의 경우 append 는 이를 모두 1차원 배열로 변형하여 합칩니다.

 

narr1 = np.array([1,2,3])
narr2 = np.array([4,5])
print( np.append(narr1, narr2) )

결괏 값

- concatenate

np 는 concatenate 를 이용하여 다차원 배열의 병합이 가능합니다.

 

concatenate( (배열1, 배열2, .. ) , axis=병합차원 )

axis 는 [[1,2]] 과 [[3,4]] 의 병합시 0 일때 [[1,2], [3,4]] 가 되고 1 일때 [[1,2,3,4]] 가 됩니다.

narr1 = np.array([[1,2],[3,4]])
narr2 = np.array([[5,6],[7,8]])
print( "axis = 0 : \n", np.concatenate( ( narr1, narr2),  axis=0) )
print( "axis = 1 : \n", np.concatenate( ( narr1, narr2),  axis=1) )

결괏 값

- c_, r_

또한 간략한 버젼으로 c_, r_ 을 사용합니다. 

 

r_ 은 axis=0 의 병합을, c_ 는 axis=-1 의 병합을 지원합니다.

쉽게말해 컬럼과 로우 입니다.

x1 = np.array([[1,2],[3,4]])
x2 = np.array([[5,6],[7,8]])

print( np.c_[x1, x2] ) # 행으로 병합
print( np.r_[x1, x2] ) # 열로 병합

결괏 값

위의 예제를 조금 응용하여 이미지에 r_을 사용하여 이미지를 위 아래로 병합한 예제는 아래와 같습니다.

 

img1 = np.full((50,50,3),[255,0,0])
img2 = np.full((50,50,3),[0,0,255])


plt.imshow(np.r_[img1, img2])
plt.show()

결괏 값

두 컬러 임지ㅣ를 옆으로 붙일때는 c_를 사용하면 되겠다고 생각하면 쉽습니다.

하지만 c_는 두 배열의 가장 마지막축을 기준으로 붙입니다.  

(50,50,3) 배열 둘을 c_ 로 붙이면 (50,100,3) 이 아니라 (50,50,6) 이 되므로 이미지 자체가 깨지게 되는데,

이 경우는 concatenate 를 사용해서 두번째 축을 기준으로 붙여야 합니다.

 

 

plt.imshow(  np.concatenate((img1,img2), axis = 1) )

결괏 값

- stack

stack 은 배열을 다시 또 하나의 배열로 묶습니다.

이는 배열의 차원의 증가를 동반하는것입니다.

np.stack( [ np.array([1,2]), np.array([3,4]) ] )

결괏 값

 

 concatenate 와 비슷해보일수있지만 아래의 예제를 통해 다른점도 확인가능합니다.

 

x,y = np.array([[1,2],[3,4]]), np.array([[5,6],[7,8]])
print("stack result:")
print( np.stack([x,y], axis = 0))
print("concatenate result:")
print( np.concatenate([x,y], axis = 0))

결괏 값

- swap

swap 은 배열의 축의 순서를 서로 변경할 수 있습니다.

(n,m) 의 형태를 가진 데이터가 있을 경우 이를 (m,n) 의 형태로 교체해줍니다.

이때 n 은 0번째 축 ( axis=0 ) , m 은 1번째 축 ( axis=1 ) 이기 때문에 다음과 같이 두 축을 서로 교환할 수 있습니다.

narr = np.arange(8).reshape(2,4)
print(narr)
print( np.swapaxes(narr, 0, 1) )  # narr 의 0번과 1번 축을 서로 교환

결괏 값

- flip

flip 은 배열의 순서를 뒤집을 수 있습니다.

narr = np.array([1,2,3])
print( np.flip(narr) )
 
-> [3,2,1] 

다차원 배열일 경우 axis = ? 의 파라미터를 이용해 어느 축을 기준으로 역순배열을 만들 것인지 결정됩니다.

만일 axis 가 주어지지 안을 경우 모든 축을 역순으로 배치합니다.

narr = np.arange(8).reshape(2,4)
print(narr)
print("\nflip by axis 0 ")
print( np.flip(narr,axis=0) )  # narr 의 세로(0번)축을 기준으로 반전
print("\nflip by axis 1 ")
print( np.flip(narr,axis=1) )  # narr 의 가로(1번)축을 기준으로 반전
print("\nflip without axis ")
print( np.flip(narr) )  # narr 의 모든 축을 반전

결괏 값

또 하나의 배열 역전 방법은 ::-1 표기를 사용하는 것입니다.

narr = np.array([1,2,3])
print( narr[::-1] ) )
->
[3,2,1]

이 방법은 여러 축중에 특정 축들을 동시에 역전시킬 수도 있습니다.

결괏 값

 

 

 

narr = np.array([[1,2],[3,4]])
print(np.flip(narr, axis = 0))
print(narr[::-1,:])

print(narr)

결괏 값

 

Comments