power-girl0-0

Numpy 본문

언어/Python

Numpy

power-girl0-0 2021. 3. 15. 23:33
728x90

 Numpy 

파이썬 기반 데이터 분석 환경에서 NumPy1는 행렬 연산을 위한 핵심 라이브러리이다.

NumPy는 “Numerical Python“의 약자로 대규모 다차원 배열과 행렬 연산에 필요한 다양한 함수를 제공한다.

특히 메모리 버퍼에 배열 데이터를 저장하고 처리하는 효율적인 인터페이스를 제공한다.

 

파이썬 list 객체를 개선한 NumPy의 ndarray 객체를 사용하면 더 많은 데이터를 더 빠르게 처리할 수 있는 장점이 있다.


NumPy는 다음과 같은 특징을 갖는다.

  • 강력한 N 차원 배열 객체
  • 정교한 브로드케스팅(Broadcast) 기능
  • C/C ++ 및 포트란 코드 통합 도구
  • 유용한 선형 대수학, 푸리에 변환 및 난수 기능
  • 범용적 데이터 처리에 사용 가능한 다차원 컨테이너

아래 두 자료를 참고하면, NumPy에게 쉽게 다가갈 수 있다.

taewan.kim/post/numpy_sum_axis/

 

Numpy에서 np.sum 함수의 axis 이해

Numpy의 sum은 유용한 함수입니다. 그러나 처음 sum 함수를 사용할 때 axis 파라미터가 무엇을 의미하는지 혼동되는 것이 사살입니다. axis의 의미를 정리합니다.

taewan.kim

taewan.kim/post/numpy_cheat_sheet/

 

파이썬 데이터 사이언스 Cheat Sheet: NumPy 기초, 기본

NumPy 기본 사용법을 정리합니다. 사용법, 가이드, 문서, 메뉴얼, 기본 문서

taewan.kim


1. numpy 패키지

numpy는 과학 계산을 위한 라이브러리로서 다차원 배열을 처리하는데 필요한 여러 유용한 기능을 제공하고 있다.

numpy는 pip을 사용하여 아래와 같이 간단히 설치할 수 있다.

   $ pip install numpy

2. numpy 배열

numpy에서 배열은 동일한 타입의 값들을 가지며, 배열의 차원을 rank 라 하고 각 차원의 크기를 튜플로 표시하는 것을 shape 라 한다. 예를 들어, 행이 2이고 열이 3인 2차원 배열에서 rank는 2 이고, shape는 (2, 3) 이 된다.

 

NumPy 배열은  아래 그림과 같이 다차원 배열을 지원한다.

NumPy 배열의 구조는 “Shape“으로 표현된다.

 

Shape은 배열의 구조를 파이썬 튜플 자료형을 이용하여 정의한다.

예를 들어 28X28 컬러 사진은 높이가 28, 폭이 28, 각 픽셀은 3개 채널(RGB)로 구성된 데이터 구조를 갖는 것이다.

즉 컬러 사진 데이터는 Shaep이 (28, 28, 3)인 3차원 배열이다.

 

다차원 배열은 입체적인 데이터 구조를 가지며, 데이터의 차원은 여러 갈래의 데이터 방향을 갖는다. 다차원 배열의 데이터 방향을 axis로 표현할 수 있다. 행방향(높이), 열방향(폭), 채널 방향은 각각 axis=0, axis=1 그리고 axis=2로 지정된다. NumPy 집계(Aggregation) 함수는 배열 데이터의 집계 방향을 지정하는 axis 옵션을 제공한다.

출처 : http://taewan.kim/post/numpy_cheat_sheet/


NumPy 배열과 파이썬 리스트의 차이

 

파이썬의 리스트는 자료의 저장에 초점을 두고 있다면, Numpy 의 배열은 특히 수학적인 행렬의 표현을 더 중시한다.

이는 두 자료형의 기본연산의 차이에서 잘 드러난다.

 

# 파이썬 배열
arr1,arr2 = [1,2,3], [4,5,6]
print( "파이썬 배열 덧셈 :", arr1 + arr2 )

# numpy 배열
narr1 = np.array(arr1)
narr2 = np.array(arr2)

print( "numpy 배열 덧셈 :", narr1 + narr2 )
print( "numpy 배열 곱셈 :", narr1 * narr2 )

 

위에서 보듯이 리스트는 + 연산자가 두 리스트의 합병을 의미하지만 Numpy 는 두 자료형의 값을 합산한 배열을 의미한다.

또한 Numpy 는 행렬이므로 각 차원의 크기가 일정해야 한다. 예를 들어서 다음의 2차원 리스트는 Numpy 로 변환시

 

위에서 arr1 은 두개의 List길이가 다르기 때문에 2차원 행렬로 변환이 불가능하다. 그래서 narr1은 리스트를 값으로 갖는 1차원 행렬로 변환이 되었지만 narr2 는 2x3 으로 변환이 가능하므로 2차원 행렬로 변환되었다.


Shape , Reshape

NumPy 배열은 다차원 배열을 기본적으로 지원하며 모든 NumPy 배열은 shape 메소드를 통해 그 차원을 알아볼 수 있다.

 

 

위 예제는 shape와 reshape의 예제이다.

 

 배열 초기화 

위에서 나온 np.array([1,2,3]) 처럼 배열을 직접 값을 줘서 만들 수 도 있지만 크기가 큰 배열의 경우 주로 초기화 루틴을 통해 만들 수 있다. 이때 배열의 크기와 형태는 shape 값을 인자로 입력한다.

 

 0으로 초기화하는 경우 

# 3 x 2 를 0으로 초기화 
narr = np.zeros((3,2))
print(narr)

 

 특정 값으로 초기화 

# 2 x 4 를 7 초 초기화 
narr = np.full((2,4), 7)
print(narr)

 

 범위지정 

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

print(narr2[0,0])

print("[:,:] -> \n", narr2[:,:],"\n") 
print("[0,:] -> ", narr2[0,:]) # 첫째 줄
print("[:,1] -> ", narr2[:,0]) # 둘째 열

 

 

범위 지정 예시 1)

narr = np.zeros((10,10))
narr[2:-2,2:-2] = 2 # 앞에 2는 위에서부터 0,1,2 즉 3번째 줄에 오겠다는 거고, -2 는 맨 아래서 부터 위로 0,1,2 즉 3칸 만큼 올라간단 소리. , 후 있는 건 가로
narr[1,1:9]= 1
narr[8,1:-1]= 1

print(narr)

 

예시 ) 반복문 없이 다음과 같은 Numpy 배열을 만들기

narr = np.zeros((10,10))

narr[1:-1,1:-1]=1
narr[2:-2,2:-2]=2
print(narr)

예시 ) 반복문 없이 임의의 짝수크기 배열의 홀수 위치만 0으로 변환

narr = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
narr1 = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
l = int(len(narr)/2) #짝수
print(narr)
narr = narr.reshape(l,2) #2개 짜리 6개
narr[:,1]=0 #모든 배열의 index 1번째 자리를 다 0으로 치환
print(narr.reshape(1,12))

#위와 같은 방법이 가능 한 줄 알았으나, 원래는 1차원 배열이고 이후 출력된 것은 2차원 배열이다.
#같은 변수를 사용하면, 영향을 미칠 것 같아 narr1으로 정의
narr1.reshape(l,2)[:,1]=0
print(narr1)

Matplotlib 를 사용한 배열 시각화

 

Matplotlib 는 파이썬에서 표, 이미지, 히스토그램등 다양한 기능을 이용해 데이터를 시각화 할 수 있는 라이브러리이다.

특히 그중에 pyplot 라이브러리를 자주 사용하는데 다음과 같이 불러온다.

import matplotlib.pyplot as plt 

 

기본 예제) 가장 기초적인 1차원 배열(x,y)를 기재해주지 않으면 x가 1,2,3,4 ..y 가 정해준 값으로 들어감.

 

import matplotlib.pyplot as plt
narr = np.array([1,3,2,5,4])
plt.plot(narr)
plt.show()

 

예제 ) 여러 그래프 합치기

from matplotlib import pyplot as plt

plt.plot([1,2,3],[1,4,9])
plt.plot([2,3,4],[5,6,7])
plt.xlabel('Sequence')
plt.ylabel('Time(secs)')
plt.title('Experiment Result')
plt.legend(['Mouse','Cat'])
plt.show()

 

배열을 연결이 아닌 점, 혹은 다른 기호로 표현 할 수 있다.

narr = np.array([1,3,2,5,4])
narr1 = np.array([2,3,4,5,6])
narr2 = np.array([5,4,3,2,1])
narr3 = np.array([4,2,4,2,6])
plt.plot(narr, '+') # 어떤 점으로 표현할 지(마크 -> . + * 등 의 기호가 있다.)
plt.plot(narr1, '-')
plt.plot(narr2, '*')
plt.plot(narr3, 'o')
plt.show()

 

히스토그램으로 표현할 수도 있다.

narr = np.array([1,1,2,2,3,4,4,4,5,5,4])
#plt.hist(narr, 3)
#plt.hist(narr, 5) # 3은 데이터 영역을 3개의 영역으로 나눈다는 뜻 //최대 개수와 부합함.
plt.hist(narr, 6) # 한개가 비는 이유는 숫자 종류가 5가지라서

plt.show()

 

 

1차원 데이터를 plot 을 사용하여 도식화 할 경우 x 축은 자동적으로 채워진다.

하지만 두개의 배열을 넣으면 각각을 x와 y값으로 간주한다.


 

예제 ) [x1,y1, x2,y2, x3,y3 .. ] 으로 구성된 짝수 크기의 배열의 각 점 (x1,y1), (x2,y2), .. 를 화면에 그려보자.

narr = np.array([1,1,1,2,1,3,1,4,1,5,2,2,3,3,4,4,5,1,5,2,5,3,5,4,5,5]) # 예제용 배열
#연습문제의 풀이를 작성해보세요
l = int(len(narr)/2)

y=narr.reshape(l,2)[:,1]
x= narr.reshape(l,2)[:,0]
plt.plot(x,y,'o')
plt.show()

예제 ) 반복없이 가로/세로줄 만들기

 

1. 세로

100x100 의 배열이 있을때 반복문 없이 배열의 reshape를 이용하여 다음과 같은 이미지를 만들어보자

narr = np.zeros((100,100)) #총 10000개의 점이 ......해서 모인것
narr = narr.reshape(1000,10) #10개짜리 1000개
narr[:,5]= 255 #y축에 선을 생기게 해줌. 연결되서 선처럼 보임. 0으로 하면 0부터 start인데, 5를 써줘서 가로로 5만큼 띄워진 곳부터 시작.
narr = narr.reshape(100,100) #100 *100의 첨 모습으로 다시 돌림
plt.imshow(narr, cmap='gray')
plt.show()

 

2. 가로 (왜 3차원인지 그림을 이해하는 것이 중요)

narr = np.zeros((100,100)) #총 10000개의 점이 ......해서 모인것
narr = narr.reshape(10,10,100) #가로는 3차원으로 해야함.
narr[:,5,:]= 255 # 255는 색상을 나타낸다.
narr = narr.reshape(100,100) #100 *100의 첨 모습으로 다시 돌림
plt.imshow(narr, cmap='gray')
plt.show()

 

3. 둘을 합침

narr = np.zeros((100,100)) #총 10000개의 점이 ......해서 모인것

narr = narr.reshape(1000,10)
narr[:,5] =255
narr = narr.reshape(10,10,100) #가로는 3차원으로 해야함.
narr[:,5,:]= 255 # 255는 색상을 나타낸다.
narr = narr.reshape(100,100) #100 *100의 첨 모습으로 다시 돌림
plt.imshow(narr, cmap='gray')
plt.show()

 

 

 

728x90

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

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