-
1. numpy_basicschool(3)/인공지능 2021. 4. 26. 22:25
narr = np.array([3,4,5], dtype = float) print(narr)
About NumPy
NumPy :
데이터 사이언스등 대규모의 배열데이터를 처리하기 위해서 다차원 배열 처리에 최적화되어있는 라이브러리 파이썬 배열에 비해 더 빠른 처리를 수행가능
Numpy 배열 생성
기초
import numpy as np narr = np.array([1,2,3,4]) print(narr)
[1 2 3 4]
파이썬 리스트를 넘피 배열로 변환하기
arr = [1,2,3] narr = np.array(arr) print(narr)
[1 3 5]
실수 배열 만들기
narr = np.array([3,4,5], dtype = float) print(narr)
[3. 4. 5.]
배열의 값을 억세스 하는 방법은 기본적으로 LiST와 유사하다.
narr = np.array([1,2,3]) print(narr[0], narr[1]) narr = np.array([[1,2,3], [4,5,6]]) print(narr[0][0], narr[1][1])
1 2
1 5
단 Numpy 는 다차원 배열의 값을 억세스 할때 다음의 구문도 가능하다.
narr = np.array([[1,2,3], [4,5,6]]) print(narr[0,0], narr[0,1], narr[1,0])
1 2 4
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 )
파이썬 배열 덧셈 : [1, 2, 3, 4, 5, 6]
numpy 배열 덧셈 : [5 7 9]
numpy 배열 곱셈 : [ 4 10 18]
위에서 보듯이 리스트는 + 연산자가 두 리스트의 합병을 의미하지만 Numpy 는 두 자료형의 값을 합산한 배열을 의미한다.
또한 Numpy 는 행렬이므로 각 차원의 크기가 일정해야 한다. 예를 들어서 다음의 2차원 리스트는 Numpy 로 변환시
arr1 = [[1,2], [3,4,5]] arr2 = [[0,1,2], [3,4,5]] narr1 = np.array(arr1) narr2 = np.array(arr2) print(narr1) print(narr2)
[list([1, 2]) list([3, 4, 5])]
[[0 1 2] [3 4 5]]
위에서 arr1 은 두개의 List길이가 다르기 때문에 2차원 행렬로 변환이 불가능하다. 그래서 narr1은 리스트를 값으로 갖는 1차원 행렬로 변황이 되었지만 narr2 는 2x3 으로 변환이 가능하므로 2차원 행렬로 변환되었다.
Shape , Reshape
NumPy 배열은 다차원 배열을 기본적으로 지원하며 모든 NumPy 배열은 shape 메소드를 통해 그 차원을 알아볼 수 있다.
narr1 = np.array([1,2,3]) narr2 = np.array([[1,2,3]]) narr3 = np.array([[1],[2],[3]]) narr4 = np.array([[[1,2],[3,4]]]) for narr in [narr1, narr2, narr3, narr4]: print(narr) print(len(narr.shape), "차원 배열 -> ",narr.shape ) print()
[1 2 3]
1 차원 배열 -> (3,)
[[1 2 3]] 2 차원 배열 -> (1, 3)
[[1]
[2]
[3]]
2 차원 배열 -> (3, 1)
[[[1 2]
[3 4]]]
3 차원 배열 -> (1, 2, 2)
Reshape를 이용하면 배열의 차원이나 형태의 변경이 가능하다. 예를 들어 (2,4) 인 형태의 배열을 (1,8) 이나 (2,2,2) 등으로 변경할 수 있다.
narr = np.array([1,2,3,4,5,6,7,8]) print(narr.reshape(1,8), "\n") print(narr.reshape(2,4), "\n") print(narr.reshape(4,2), "\n") print(narr.reshape(2,2,2), "\n")
배열 초기화
위에서 나온 np.array([1,2,3]) 처럼 배열을 직접 값을 줘서 만들 수 도 있지만 크기가 큰 배열의 경우 주로 초기화 루틴을 통해 만들 수 있다. 이때 배열의 크기와 형태는 shape 값을 인자로 입력한다.
# 3 x 2 를 0으로 초기화 narr = np.zeros((3,2)) print(narr)
[[0. 0.]
[0. 0.]
[0. 0.]]
특정 값으로 초기화
# 2 x 4 를 7 초 초기화 narr = np.full((2,4), 7) print(narr)
[[7 7 7 7]
[7 7 7 7]]
배열의 범위지정
파이썬의 리스트는 ':' 를 이용한 범위지정이 가능하다.
l = [1,2,3,4,5] print(l[1:4]) -> 2,3,4
Numpy 도 이러한 범위지정을 사용할 수 있다
narr = np.array([1,2,3,4]) print(": ->", narr[:]) print("0:1 ->", narr[0:1]) print("1: ->", narr[1:] ) print(":3 ->", narr[:3] ) print("1:-1->", narr[1:-1] ) : -> [1 2 3 4] 0:1 -> [1] 1: -> [2 3 4] :3 -> [1 2 3] 1:-1-> [2 3]
이러한 범위지정은 다차원 배열에서 그 활용도가 더욱 커진다.
narr2 = np.array([[1,2,3], [4,5,6]]) print(narr2[0,0]) print("[:,:] -> \n", narr2[:,:],"\n") print("[0,:] -> ", narr2[0,:]) # 첫째 줄 print("[:,1] -> ", narr2[:,1]) # 둘째 열 1 [:,:] -> [[1 2 3] [4 5 6]] [0,:] -> [1 2 3] [:,1] -> [2 5]
이러한 범위지정을 이용해 배열의 일부에 대해 원하는 값을 대입할 수도 있다.
narr = np.zeros((10,10)) narr[:,0] = 1 print(narr) [[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
연습문제 1-1 : 반복문 없이 다음과 같은 Numpy 배열을 만들기
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] narr = np.zeros((10,10)) #연습문제 1-1 을 여기에 작성해보세요 narr[1:9,1:9]=1 narr[2:8,2:8]=2 print(narr) [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.] [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
연습문제 1-2 : 반복문 없이 임의의 짝수크기 배열의 홀수 위치만 0으로 변환
예: [1,2,3,4,5,6] -> [1,0,3,0,5,0]
참고 : 배열 길이의 반 = int( len(arr) / 2)
[40]
narr = np.array([1,2,3,4,5,6,7,8,9,10,11,12]) l = int( len(narr) / 2 ) #연습문제 1-2 풀이를 작성해보세요 narr[0::2]=0 print(narr) [ 0 2 0 4 0 6 0 8 0 10 0 12]
Matplotlib 를 사용한 배열 시각화
Matplotlib 는 파이썬에서 표, 이미지, 히스토그램등 다양한 기능을 이용해 데이터를 시각화 할 수 있는 라이브러리이다. 특히 그중에 pyplot 라이브러리를 자주 사용하는데 다음과 같이 불러온다.
배열을 점, 선으로 표현하기
가장 기초적인 1차원 배열을 시각화하는 방법의 예제가 아래에 나와있다.
narr = np.array([1,3,2,5,4]) plt.plot(narr) plt.show()
여러 그래프를 겹쳐서 그릴 수도 있다.
narr1 = np.array([5,1,3,4,2]) narr2 = np.array([1,3,2,5,4]) plt.plot(narr1) plt.plot(narr2) plt.show()
배열을 연결이 아니라 점으로 표현 할 수도 있다.
narr = np.array([1,3,2,5,4]) plt.plot(narr, 'o') plt.show()
다음은 데이터를 히스토그램으로 표현할 수도 있다.
narr = np.array([1,1,2,2,3,4,4,4,5,5,4]) plt.hist(narr, 3) # 3은 데이터 영역을 3개의 영역으로 나눈다는 뜻 plt.show()
1차원 데이터를 plot 을 사용하여 도식화 할 경우 x 축은 자동적으로 채워진다. 하지만 두개의 배열을 넣으면 각각을 x와 y값으로 간주한다.
y = np.array([1,3,2,5,4]) x = np.array([1,1,2,3,3]) plt.plot(x, y, 'o') plt.show()
연습문제 1-3 : 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 ) narr=narr.reshape(l,2) print(narr) print(narr[:,0],narr[:,1]) plt.plot(narr[:,0],narr[:,1],'.') plt.show()
배열을 이미지로 표현하기
plt.imshow 는 2차원 배열을 이미지로 화면에 표현한다. 아래에는 100x100 의 값을 이미지로 화면에 표시하는 예제가 나와있다. cmap = 'gray' 는 각 수치를 흑백명도로 표현하라는 뜻이며 이 옵션이 없으면 세번째 그림처럼 수치마다 랜덤 색상을 배정한다.
narr = np.zeros((100,100)) plt.imshow(narr, cmap = 'gray') plt.show() narr[10:-10, 10:-10] = 255 plt.imshow(narr, cmap = 'gray') plt.show() narr[30:-30, 30:-30] = 100 plt.imshow(narr) plt.show()
연습문제 1-4 : 반복없이 세로줄 만들기
100x100 의 배열이 있을때 반복문 없이 배열의 reshape를 이용하여 다음과 같은 이미지를 만들어보자
narr = np.zeros((100,100)) # 연습문제의 코드를 작성하세요 narr.reshape(10,1000) narr[:,5]=255 narr= narr.reshape(10,100,10) narr[:,:,4] = 255 narr= narr.reshape(10,10,100) narr[:,2,:] = 255 narr=narr.reshape(100,100) plt.imshow(narr, cmap = 'gray') plt.show()
하지만 width x height x 3 으로 각 칫수마다 3개의 숫자로 이뤄진 경우 컬러 이미지로 간주하고 컬러로 표시된다.
narr = np.full((100,100,3), [255,0,0]) # 100x100x3 의 배열을 [255,0, 0] 으로 체우고 narr[20:-20, 20:-20] = [100,0,0] # 가운대 40개의 점을 [100,0,0] 으로 채운다. plt.imshow(narr)