반응형
Numpy 실습
Numpy 배열 연산
1. Numpy 패키지 불러오기
import numpy as np #보통 np를 붙여 numpy를 np로 대체한다.
2. Numpy 배열 만들기
import numpy as np
# list 타입의 배열을 생성합니다.
arr = [1, 2, 3, 4, 5]
print(arr, type(arr))
[1, 2, 3, 4, 5] <class 'list'>
# numpy.ndarray 타입의 배열을 생성합니다.
np_arr = np.array(arr)
print(np_arr, type(np_arr))
[1 2 3 4 5] <class 'numpy.ndarray'>
3. Numpy 배열의 모양
- numpy.ndarray타입을 가진 배열의 모양을 얻어오는 방법
A = np.array([[1, 1, 1], [2, 3 ,4]])
print(A.shape)
B = np.array([
[[1, 2, 3], [1, 2, 3]],
[[2, 3, 4], [5, 6, 7]]])
print(B.shape)
(2, 3)
(2, 2, 3)
4. Numpy one, zero 배열 생성
- list를 구현하여 numpy.ndarray타입의 배열로 바꿨습니다. 이번에는 Numpy의 함수를 사용하여 1로만 이루어진 배열 및 0으로만 이루어진 배열을 만들어보도록 하겠습니다.
# 2 x 3의 모양을 가지고 1로 채워진 배열을 만들어줍니다.
ones_arr = np.ones(shape=(2, 3))
print(ones_arr)
# 2 x 3의 모양을 가지고 0으로 채워진 배열을 만들어줍니다.
zeros_arr = np.zeros(shape=(2, 3))
print(zeros_arr)
[[1. 1. 1.]
[1. 1. 1.]]
[[0. 0. 0.]
[0. 0. 0.]]
5. Numpy 랜덤 배열 만들기
- randn()에 모양을 인자로 주어 배열을 생성합니다. 이때, randn()에 들어간 인자의 순서대로 차원의 크기가 정해집니다. 예를 들어, randn(3, 2)는 3 x 2 모양을 가진 2차원 배열을 생성합니다.
- normal()은 정규 분포에 맞게 생성하는 함수로서 모양을 size 인자를 통해 전달하여 배열을 생성합니다. 이때 평균(mean)과 표준편차(std)값을 각각 loc, scale 인자를 통해 지정할 수 있습니다.
- randint(start, end, size)는 임의의 정수들로 채워진 배열을 만들어줍니다. 이때 정수 범위는 start 이상 end 미만으로, size에 모양을 인자로 전달합니다.
Seed
- 파이썬의 random패키지와 같이 seed를 고정하여 일정하게 랜덤 값을 유지할 수 있습니다.
- ex) np.random.seed(42)
# 3 x 2의 모양을 가진 배열을 가우시안 분포에 따라 랜덤하게 만들어줍니다.
randn_arr = np.random.randn(3,2)
print(randn_arr)
print()
# 3 x 2의 모양을 가진 배열을 랜덤하게 만들어줍니다.
rand_arr = np.random.normal(size=(3, 2))
print(rand_arr)
print()
# 3 x 2의 모양을 가진 배열을 정규 분포에 따라 랜덤하게 만들어줍니다.
rand_normal_arr = np.random.normal(loc = 3, scale = 0.25, size=(3, 2))
print(rand_normal_arr)
print()
# 3 x 2의 모양을 가지고, 1부터 9까지 임의의 정수로만 이루어진 배열을 만들어줍니다.
rand_int_arr = np.random.randint(1, 10, size=(3, 2))
print(rand_normal_arr)
[[ 0.18712803 -0.57520176]
[-0.59251761 0.39332892]
[ 0.98645776 0.485095 ]]
[[-0.52020431 0.32502522]
[-0.88708161 1.07160966]
[-1.99485528 -0.32043217]]
[[3.05998909 2.6500203 ]
[2.68844559 2.7498918 ]
[3.07484768 3.25831177]]
[[3.05998909 2.6500203 ]
[2.68844559 2.7498918 ]
[3.07484768 3.25831177]]
6. 특정 요소 읽어오기
- numpy.ndarray 타입의 배열에 존재하는 요소들에 대해서 접근해봅시다.
- 1. 1차원 배열
import numpy as np
arr = [1, 3, 10, 55, 31, 12, 15]
A = np.array(arr)
print(A[3])
55
- Python의 list와 동일하게 1차원 배열에 대해서 인덱스를 가지고 요소에 접근할 수 있습니다. 그렇다면 2차원 배열에 대해서 어떻게 접근할까요?
- 2. 2차원 배열
import numpy as np
arr = [[1, 2, 4], [12, 15, 17]]
print(arr[1][2])
17
np_arr = np.array(arr)
print(np_arr[1][2])
17
print(np_arr[1, 2])
17
- Python의 list와 동일하게 인덱싱이 가능하지만 보편적으로 []안에 쉼표를 기준으로 구분하여 인덱싱하는 것을 권장합니다.
7. 특정 요소 변경하기
이제 numpy.ndarray 타입의 배열에 존재하는 요소들을 변경해보도록 합시다.
1차원 배열
arr = [1, 3, 10, 55, 31, 12, 15]
A = np.array(arr)
A[3] = 22
print(A)
[ 1 3 10 22 31 12 15]
- 2차원 배열
arr = [[1, 2, 4], [12, 15, 17]]
np_arr = np.array(arr)
np_arr[1, 2] = 100
print(np_arr)
[[ 1 2 4]
[ 12 15 100]]
8. Numpy 덧셈 연산
- List 방식
- list를 사용하여 1차원 배열 간의 요소별 덧셈 연산을 행할 때 다음과 같이 작성합니다.
li_A = [1, 2, 3, 4, 5]
li_B = [6, 7, 8, 9, 10]
result = [a + b for a, b in zip(li_A, li_B)]
print(result)
[7, 9, 11, 13, 15]
- Numpy 방식
- Numpy를 이용하면 높은 차원의 배열일지라도 같은 모양을 가졌다면, 여러 개의 for문이 아닌 단 한 줄의 코드만으로 연산 코드를 작성할 수 있습니다.
- numpy.ndarray 타입을 가진 배열 간 연산을 할 경우 Numpy 패키지 내부에서 for문과 동일한 방식으로 모든 요소를 탐색하며 연산하더라도 Python의 list 및 for문을 통해 연산하는 것보다 빠른 것입니다.
arr_A = np.array([1, 2, 3, 4, 5])
arr_B = np.array([6, 7, 8, 9, 10])
result = arr_A + arr_B
print(result)
[ 7 9 11 13 15]
9. Numpy 곱셈, 뺄셈, 나눗셈, 나머지 연산
곱셈 연산
-연산자가 행렬 곱을 의미하는 것이 아닌 같은 위치의 요소끼리 곱했다는 점을 명심하세요.
arr_A = np.array([1, 2, 3, 4, 5])
arr_B = np.array([6, 7, 8, 9, 10])
result = arr_A * arr_B
print(result)
[ 6 14 24 36 50]
- 뺄셈 연산
arr_A = np.array([6, 4, 2, 5, 9])
arr_B = np.array([3, 1, 3, 4, 10])
result = arr_A - arr_B
print(result)
[ 3 3 -1 1 -1]
- 나눗셈 연산
arr_A = np.array([2, 6, 6])
arr_B = np.array([4, 3, 8])
result = arr_A / arr_B
print(result)
[0.5 2. 0.75]
- 나머지 연산
arr_A = np.array([5, 3, 6])
arr_B = np.array([2, 2, 4])
result = arr_A % arr_B
print(result)
[1 1 2]
10. Numpy 배열 연산 - 브로드캐스팅
- Numpy에서는 같은 모양의 배열이 아니더라도
(1)상수를 배열에 더하거나,
(2)모양이 다른 배열끼리 덧셈 연산이 가능합니다
(단, 특정 조건을 갖춘 배열이여야 합니다). 이와 같이 Numpy에서 배열의 모양이 다르더라도 자동으로 맞춰 연산하는 것을 브로드캐스팅이라고 합니다
A = [
[10, 10, 10, 20, 20],
[21, 87, 31, 25, 64],
[16, 39, 10, 23, 30],
[88, 13, 52, 12, 47],
[53, 23, 41, 16, 73]]
A = np.array(A)
result1 = A + 13
print(result1)
print()
B = np.array([1, 2, 3, 4, 5])
result2 = A + B
print(result2)
[[ 23 23 23 33 33]
[ 34 100 44 38 77]
[ 29 52 23 36 43]
[101 26 65 25 60]
[ 66 36 54 29 86]]
[[11 12 13 24 25]
[22 89 34 29 69]
[17 41 13 27 35]
[89 15 55 16 52]
[54 25 44 20 78]]
11. Numpy dot
- *연산자를 사용하여 행렬 간 같은 위치(인덱스)의 요소별로 곱셈 연산과 행렬 곱 연산은 아래 그림과 같이 다르게 연산합니다.
- dot 연산은 다음과 같이 구현할 수 있습니다.
1. A.dot(B)
2. np.dot(A, B)
A = np.array([[1, 2], [2, 3]])
B = np.array([[4, 1], [6, 7]])
print(A * B)
print()
print(A.dot(B))
print()
print(np.dot(A, B))
[[ 4 2]
[12 21]]
[[16 15]
[26 23]]
[[16 15]
[26 23]]
12. Numpy 배열 슬라이싱
list의 리스트와 달리 numpy.ndarray의 배열을 슬라이싱하여 값을 변경할 때, 크기 또는 모양이 맞지 않으면 에러를 발생합니다. 즉, 슬라이싱을 이용하여 값을 변경할 때는 대입할 배열의 모양이 슬라이싱을 한 구간과 일치해야 합니다.
위처럼 동일한 모양의 배열을 대입함으로써 값을 변경하는 방법도 있지만, 브로드캐스팅을 이용하여 슬라이싱 구간에 자동으로 모양을 맞춰 변경하는 방법도 있습니다.
- 1차원 배열의 슬라이싱을 이용한 값 변경
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
arr[3:7] = 100
print(arr)
[ 1 2 3 100 100 100 100 8 9 10]
- 2차원 배열의 슬라이싱을 이용한 값 변경
arr = np.array([
[1, 2, 3, 4, 5],
[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9],
[10, 11, 14, 15, 17]
])
print("바뀌기전 :",
arr)
arr[1:3, 1:3] = np.array([[10, 20], [30, 40]])
print("바뀐 후 :",arr)
바뀌기전 : [[ 1 2 3 4 5]
[ 4 5 6 7 8]
[ 5 6 7 8 9]
[10 11 14 15 17]]
바뀐 후 : [[ 1 2 3 4 5]
[ 4 10 20 7 8]
[ 5 30 40 8 9]
[10 11 14 15 17]]
'AI_Bootcamp' 카테고리의 다른 글
AWS를 활용한 인공지능 모델 배포 chap1 (1) | 2022.01.18 |
---|---|
3주차 Day12 Numpy 실습 II (0) | 2022.01.18 |
2주차 Day 10 Flask EDA 주말과제 (0) | 2022.01.17 |
2주차 Day 10 Flask와 EDA (0) | 2022.01.17 |
2주차 Day09 Flask와 EDA chap2 (0) | 2022.01.17 |