NumPy 기초 문법 NumPy 라이브 블러오기 1 2 import numpy as np print (np.__version__)
1.21.5
배열로 변환
1부터 10까지의 리스트를 만든다.
NumPy 배열로 변환해서 저장한다.
1 2 3 temp = [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] arr = np.array(temp) print (arr)
[ 1 2 3 4 5 6 7 8 9 10]
1 2 print (type (temp))print (type (arr))
<class 'list'>
<class 'numpy.ndarray'>
1 2 print (arr[4 ]) print (arr[4 :8 ])
5
[5 6 7 8]
NumPy를 사용하여 기초 통계 함수를 사용한다.
1 2 3 4 print (np.mean(arr)) print (np.sum (arr)) print (np.median(arr)) print (np.std(arr))
5.5
55
5.5
2.8722813232690143
사칙연산 1 2 3 4 5 math_scores = [90 , 80 , 88 ] english_scores = [80 , 70 , 90 ] total_scores = math_scores + english_scores print (total_scores)
[90, 80, 88, 80, 70, 90]
1 2 3 4 5 6 7 8 math_scores = [90 , 80 , 88 ] english_scores = [80 , 70 , 90 ] math_arr = np.array(math_scores) english_arr = np.array(english_scores) total_scores = math_arr + english_arr print (total_scores)
[170 150 178]
1 2 print (np.min (total_scores)) print (np.max (total_scores))
150
178
NumPy 메서드 사칙연산 1 2 3 4 5 6 7 8 9 10 11 12 13 14 print ("덧셈:" , np.add(math_arr, english_arr))print ("뺄셈:" , np.subtract(math_arr, english_arr))print ("곱셈:" , np.multiply(math_arr, english_arr))print ("나눗셈:" , np.divide(math_arr, english_arr))print ("거듭제곱:" , np.power(math_arr, english_arr))
덧셈: [170 150 178]
뺄셈: [10 10 -2]
곱셈: [7200 5600 7920]
나눗셈: [1.125 1.14285714 0.97777778]
거듭제곱: [0 0 0]
배열의 생성
0차원부터 3차원까지 생성하는 방법
.shape 은 배열의 크기
.ndim 은 차원을 알려준다.
1 2 3 4 5 temp_arr = np.array(20 ) print (temp_arr)print (type (temp_arr))print (temp_arr.shape) print (temp_arr.ndim)
20
<class 'numpy.ndarray'>
()
0
1 2 3 4 5 6 temp_arr = np.array([1 , 2 , 3 ]) print (temp_arr)print (type (temp_arr))print (temp_arr.shape) print (temp_arr.ndim)
[1 2 3]
<class 'numpy.ndarray'>
(3,)
1
2차원 배열 1 2 3 4 5 temp_arr = np.array([[1 , 2 , 3 ],[4 , 5 , 6 ]]) print (temp_arr)print (type (temp_arr))print (temp_arr.shape) print (temp_arr.ndim)
[[1 2 3]
[4 5 6]]
<class 'numpy.ndarray'>
(2, 3)
2
3차원 배열 1 2 3 4 5 temp_arr = np.array([[[1 , 2 , 3 ],[4 , 5 , 6 ]], [[1 , 2 , 3 ],[4 , 5 , 6 ]]]) print (temp_arr)print (type (temp_arr))print (temp_arr.shape) print (temp_arr.ndim)
[[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]]
<class 'numpy.ndarray'>
(2, 2, 3)
3
2 * 2 * 3 에서 각 숫자를 하나의 축이라고 생각하면 된다.
숫자가 3개니 3차원인 것이다.
1 2 3 4 5 temp_arr = np.array([1 , 2 , 3 , 4 ], ndmin = 2 ) print (temp_arr)print (type (temp_arr))print (temp_arr.shape) print (temp_arr.ndim)
[[1 2 3 4]]
<class 'numpy.ndarray'>
(1, 4)
2
마찬가지로, 1 * 4 는 2개의 축으로 이루어져 있으니 2차원인 것이다.
소숫점 정렬 1 2 temp_arr = np.trunc([-1.23 , 1 ,23 ]) temp_arr
array([-1., 1., 23.])
1 2 temp_arr = np.fix([-1.23 , 1 ,23 ]) temp_arr
array([-1., 1., 23.])
1 2 temp_arr = np.around([-1.23789 , 1 ,23789 ], 4 ) temp_arr
array([-1.2379e+00, 1.0000e+00, 2.3789e+04])
1 2 temp_arr = np.round ([-1.23 , 1 ,23 ], 4 ) temp_arr
array([-1.23, 1. , 23. ])
1 2 temp_arr = np.floor([-1.23 , 1 ,23 ]) temp_arr
array([-2., 1., 23.])
1 2 temp_arr = np.ceil([-1.23 , 1 ,23 ]) temp_arr
array([-1., 1., 23.])
다양한 배열 생성 방법 1 2 temp_arr = np.arange(5 ) temp_arr
array([0, 1, 2, 3, 4])
1 2 temp_arr = np.arange(1 , 9 , 3 ) temp_arr
array([1, 4, 7])
np.zeros(()) 는 원하는 사이즈만큼 0으로 구성된 배열 생성
1 2 3 4 5 6 zero_arr = np.zeros((2 , 3 )) print (zero_arr)print (type (zero_arr))print (zero_arr.shape)print (zero_arr.ndim)print (zero_arr.dtype)
[[0. 0. 0.]
[0. 0. 0.]]
<class 'numpy.ndarray'>
(2, 3)
2
float64
1 2 3 4 5 6 7 8 temp_arr = np.ones((4 , 5 ), dtype="int32" ) print (temp_arr)print (type (temp_arr))print (temp_arr.shape)print (temp_arr.ndim)print (temp_arr.dtype)
[[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]
[1 1 1 1 1]]
<class 'numpy.ndarray'>
(4, 5)
2
int32
reshape
-1의 의미는 자동설정해준다는 것이다. 나중에 머신러닝할 때 유용하다.
magic keyword라고 한다.
1 2 3 4 5 6 7 8 9 temp_arr = np.ones((12 , 12 ), dtype="int32" ) temp_res_arr = temp_arr.reshape(4 , -1 ) print (temp_res_arr)print (type (temp_res_arr))print (temp_res_arr.shape)print (temp_res_arr.ndim)print (temp_res_arr.dtype)
[[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]]
<class 'numpy.ndarray'>
(4, 36)
2
int32
numpy 조건식 np.where(조건식, 참, 거짓)
조건식이 하나일때 np.where()을 사용한다.
1 2 temp_arr = np.arange(10 ) temp_arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1 2 3 4 np.where(temp_arr < 5 , temp_arr, temp_arr * 10 )
array([ 0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
퀴즈
0 ~ 100 까지의 배열 생성 후, 50보다 작은 값은 곱하기 10, 나머지는 그냥 원래 값 반환
1 2 3 temp_arr = np.arange(101 ) temp_arr np.where(temp_arr < 50 , temp_arr * 10 , temp_arr)
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,
130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250,
260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380,
390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 50, 51,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100])
np.select(condlist, choicelist, default = )
사실 다중조건을 더 많이 사용한다.
이 때는 np.select를 사용한다.
condlist는 조건식 리스트이다.
choicelist는 조건식이 참일때 수행할 명령 리스트이다.
condlist와 choicelist 요소들은 맞춰주어야 한다.
default를 설정 안해주면 0인데, 아래에서 확인해보자.
1 2 3 4 5 temp_arr = np.arange(10 ) temp_arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1 2 3 4 condlist = [temp_arr > 5 , temp_arr < 2 ] choicelist = [temp_arr * 2 , temp_arr + 100 ] print (np.select(condlist, choicelist)) print (np.select(condlist, choicelist, default = temp_arr))
[100 101 0 0 0 0 12 14 16 18]
[100 101 2 3 4 5 12 14 16 18]
교재 넘파이 부분 손코딩 실습
1 2 3 4 5 6 7 8 9 10 11 fish_length = [25.4 , 26.3 , 26.5 , 29.0 , 29.0 , 29.7 , 29.7 , 30.0 , 30.0 , 30.7 , 31.0 , 31.0 , 31.5 , 32.0 , 32.0 , 32.0 , 33.0 , 33.0 , 33.5 , 33.5 , 34.0 , 34.0 , 34.5 , 35.0 , 35.0 , 35.0 , 35.0 , 36.0 , 36.0 , 37.0 , 38.5 , 38.5 , 39.5 , 41.0 , 41.0 , 9.8 , 10.5 , 10.6 , 11.0 , 11.2 , 11.3 , 11.8 , 11.8 , 12.0 , 12.2 , 12.4 , 13.0 , 14.3 , 15.0 ] fish_weight = [242.0 , 290.0 , 340.0 , 363.0 , 430.0 , 450.0 , 500.0 , 390.0 , 450.0 , 500.0 , 475.0 , 500.0 , 500.0 , 340.0 , 600.0 , 600.0 , 700.0 , 700.0 , 610.0 , 650.0 , 575.0 , 685.0 , 620.0 , 680.0 , 700.0 , 725.0 , 720.0 , 714.0 , 850.0 , 1000.0 , 920.0 , 955.0 , 925.0 , 975.0 , 950.0 , 6.7 , 7.5 , 7.0 , 9.7 , 9.8 , 8.7 , 10.0 , 9.9 , 9.8 , 12.2 , 13.4 , 12.2 , 19.7 , 19.9 ] fish_data = [[l ,w] for l, w in zip (fish_length, fish_weight)] fish_target = [1 ]*35 + [0 ]*14
1 2 from sklearn.neighbors import KNeighborsClassifierkn = KNeighborsClassifier()
[29.0, 430.0]
[[25.4, 242.0], [26.3, 290.0], [26.5, 340.0], [29.0, 363.0], [29.0, 430.0]]
1 2 3 4 train_input = fish_data[:35 ] train_target = fish_target[:35 ] test_input = fish_data[35 :] test_target = fish_target[35 :]
1 2 kn = kn.fit(train_input, train_target) kn.score(test_input, test_target)
0.0
도미와 빙어가 골고루 섞여야 하는데 마지막 35번부터는 빙어만 있으니 제대로 학습을 못하게 된 것.
이것을 샘플링 편향 sampling bias
즉, 훈련 세트에 도미만 있기 때문에 테스트 세트가 무엇이든 도미로 판단하게 된다.
골고루 섞기 위해서 numpy 라이브러리가 필요하다.
1 2 3 4 import numpy as npinput_arr = np.array(fish_data) target_arr = np.array(fish_target) print (input_arr)
[[ 25.4 242. ]
[ 26.3 290. ]
[ 26.5 340. ]
[ 29. 363. ]
[ 29. 430. ]
[ 29.7 450. ]
[ 29.7 500. ]
[ 30. 390. ]
[ 30. 450. ]
[ 30.7 500. ]
[ 31. 475. ]
[ 31. 500. ]
[ 31.5 500. ]
[ 32. 340. ]
[ 32. 600. ]
[ 32. 600. ]
[ 33. 700. ]
[ 33. 700. ]
[ 33.5 610. ]
[ 33.5 650. ]
[ 34. 575. ]
[ 34. 685. ]
[ 34.5 620. ]
[ 35. 680. ]
[ 35. 700. ]
[ 35. 725. ]
[ 35. 720. ]
[ 36. 714. ]
[ 36. 850. ]
[ 37. 1000. ]
[ 38.5 920. ]
[ 38.5 955. ]
[ 39.5 925. ]
[ 41. 975. ]
[ 41. 950. ]
[ 9.8 6.7]
[ 10.5 7.5]
[ 10.6 7. ]
[ 11. 9.7]
[ 11.2 9.8]
[ 11.3 8.7]
[ 11.8 10. ]
[ 11.8 9.9]
[ 12. 9.8]
[ 12.2 12.2]
[ 12.4 13.4]
[ 13. 12.2]
[ 14.3 19.7]
[ 15. 19.9]]
(49, 2)
넘파이 배열로 준비는 마쳤다.
여기에서 랜덤으로 추출해보자.
아예 인덱스를 섞은 다음 input_arr와 target_arr에서 샘플을 선택하면 무작위로 훈련 세트를 나누는 셈이 될 것이다.
넘파이 arange() 함수를 사용해서 0부터 48까지 1씩 증가하는 인덱스를 만든다.
인덱스를 랜덤하게 섞는다.
넘파이에서 무작위 결과를 만드는 함수들은 실행할 때마다 다른 결과를 만들기 때문에 일정한 결과를 얻으려면 랜덤 시드(random seed)를 지정해줘야 한다.
1 2 3 np.random.seed(42 ) index = np.arange(49 ) np.random.shuffle(index)
[13 45 47 44 17 27 26 25 31 19 12 4 34 8 3 6 40 41 46 15 9 16 24 33
30 0 43 32 5 29 11 36 1 21 2 37 35 23 39 10 22 18 48 20 7 42 14 28
38]
랜덤하게 섞인 인덱스를 가지고 전체 데이터를 훈련 세트와 테스트 세트로 나누자.
넘파이에 배열 인덱싱(array indexing) 기능 이용
[[ 26.3 290. ]
[ 29. 363. ]]
1 2 train_input = input_arr[index[:35 ]] train_target = target_arr[index[:35 ]]
만들어진 index의 첫 번째 값은 13임을 확인했다. 따라서, train_input의 첫 번째 원소는 input_arr의 열 네 번째 원소가 들어있을 것이다. 확인해보자.
1 print (input_arr[13 ], train_input[0 ])
[ 32. 340.] [ 32. 340.]
이번에는 나머지 14개를 테스트 세트로 만들자
1 2 test_input = input_arr[index[35 :]] test_target = target_arr[index[35 :]]
데이터 세트들이 잘 섞였는 지 산점도 그래프로 확인
1 2 3 4 5 6 7 import matplotlib.pyplot as pltplt.scatter(train_input[:,0 ], train_input[:,1 ]) plt.scatter(test_input[:,0 ], test_input[:,1 ]) plt.xlabel('length' ) plt.ylabel('weight' ) plt.show()