power-girl0-0

[ Numpy ] 변환 본문

언어/Python

[ Numpy ] 변환

power-girl0-0 2021. 3. 29. 15:28
728x90

reshape 가 배열의 순서를 유지하는 상태에서 배열의 형태만 유지한다면, 아예 새로운 배열로

변환하는 방법이 있다.


 0. 환경설정 

먼저, 활용을 위해서 세팅을 아래와 같이 해주자.

import numpy as np
import matplotlib.pyplot as plt 

 1. 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) )

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


 2. 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) )

 

편의를 위해 axis = 0 인경우를 대신해 vstack 이라는 함수를 axis = 1 인 경우에는 hstack 이라는 함수를 사용하기도 한다.


 3. c_,r_ 

c는 column, r은 row는 의미한다.

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) )


 4. 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))


문제1. 두 분포 데이터 합치기

다음 두 점의 그룹 (x1,y1) 과 (x2,y2) 를 하나의 그룹으로 만드세요

#10,10 을 중심으로 분포하는 100개의 점
x1,y1 = np.random.normal(10,5,100), np.random.normal(10,5,100)
plt.plot(x1,y1,'.')

#70,50 을 중심으로 분포하는 100개의 점
x2,y2 = np.random.normal(70,5,100), np.random.normal(50,5,100)
plt.plot(x2,y2,'.')

plt.xlim(0,100) # x 축 표시 범위: 0~100
plt.ylim(0,100) # y 축 표시 범위: 0~100 

plt.show()

# 연습문제 풀이코드를 여기에 작성해서 두 군집 배열을 합쳐서 하나의 x와 y로 만드세요

정답

더보기
더보기
#10,10 을 중심으로 분포하는 100개의 점
x1,y1 = np.random.normal(10,5,100), np.random.normal(10,5,100)

#70,50 을 중심으로 분포하는 100개의 점
x2,y2 = np.random.normal(70,5,100), np.random.normal(50,5,100)

x = np.append(x1, x2)
y = np.append(y1, y2)

plt.plot(x,y,'.')

plt.xlim(0,100) # x 축 표시 범위: 0~100
plt.ylim(0,100) # y 축 표시 범위: 0~100 

plt.show()

 

728x90

'언어 > Python' 카테고리의 다른 글

[ Numpy ] 랜덤 생성  (0) 2021.03.29
Numpy  (0) 2021.03.15
구글 코랩 사용법  (0) 2021.03.08
[ 15596 ] 정수 N개의 합  (0) 2021.03.02
Python 개요  (0) 2020.12.16
Comments