In [1]:
import numpy as np
# np로 많이 불러옴.
Array 만들기¶
In [2]:
lst = [1,2,3,4,5]
np_arr = np.array(lst)
np_arr
Out[2]:
array([1, 2, 3, 4, 5])
배열의 모양¶
In [4]:
A = np.array([[1,1,1],[1,2,3]])
B = np.array([
[[1,2,3],[1,2,3],
[3,4,5],[3,4,3]]
])
print(A.shape)
print(B.shape)
(2, 3)
(1, 4, 3)
배열의 모양이라는게 제일 밖의 괄호를 기준으로 한꺼풀씩 세어가는 것 같은데
특수한 배열 생성 (ones, zeros함수)¶
In [5]:
ones_arr = np.ones(shape=(2,3))
zeros_arr = np.zeros(shape=(2,3))
print(ones_arr)
print(zeros_arr)
[[1. 1. 1.]
[1. 1. 1.]]
[[0. 0. 0.]
[0. 0. 0.]]
Random 배열 생성 (numpy 내부 Random 함수)¶
In [6]:
# 3 * 2 의 모양을 가진 배열을 정규분포에 따라 랜덤하게 만들어줍니다.
rand_normal_arr = np.random.normal(loc=3, scale = 0.25, size = (3,2))
print (rand_normal_arr)
# 3 * 2 의 모양을 가지고 1부터 9까지 임의의 정수로만 이루어진 배열을 만들어라
rand_int_arr = np.random.randint(1,9+1,size = (3,2))
print(rand_int_arr)
[[2.82038096 3.03887975]
[3.00700112 3.3828024 ]
[2.67334873 2.76394743]]
[[3 9]
[4 1]
[8 4]]
Array 인덱싱¶
- 리스트와 마찬가지로 lst[ ][ ]처럼 arr[ ][ ]이 가능하지만, 일반적으로 arr[ , ]로 쉼표를 기준으로 구분하여 인덱싱하는것을 권장하고있음.
In [8]:
arr = np.array([[1, 2, 4], [12, 15, 16]])
print(arr[1][2]) # 이렇게도 가능하지만
print(arr[1, 2]) # 이 방식이 선호된다.
16
16
Array 특정 요소 변경¶
In [11]:
arr[1,2] = 100 # 인덱스 위치에다가 값을 집어넣으면 돼.
print(arr)
[[ 1 2 4]
[ 12 15 100]]
Array 사칙연산¶
- 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지연산은 같은 인덱스의 항목끼리 연산해준다.
In [16]:
arr_A = np.array([1,2,3,4,5])
arr_B = np.array([2,3,4,5,6])
# 덧셈
print(arr_A + arr_B)
# 뺄셈
print(arr_A - arr_B)
# 곱셈
print(arr_A * arr_B)
# 나눗셈
print(arr_A / arr_B)
# 나머지연산
print(arr_A % arr_B)
[ 3 5 7 9 11]
[-1 -1 -1 -1 -1]
[ 2 6 12 20 30]
[0.5 0.66666667 0.75 0.8 0.83333333]
[1 2 3 4 5]
브로드 캐스팅¶
- 리스트는 항상 같은 크기끼리 더해줬어야 했는데, 배열은 배열 + 상수 도 가능하다.
- 무조건 같은 모양의 배열을 더하는 게 아니더라도 연산이 가능할 수 있다.
In [19]:
A = [
[1, 1, 1],
[2, 2, 2],
[3, 3, 3]
]
A = np.array(A)
result = A + 10 # array에 상수를 더하네?
print(A)
print(result)
[[1 1 1]
[2 2 2]
[3 3 3]]
[[11 11 11]
[12 12 12]
[13 13 13]]
행렬 곱 (a11b11 + a12 b21 = c11) ( dot() method)¶
- 행렬을 했다면 알겠지만, 같은 인덱스 항목끼리 곱해주는게 아니거든요..
In [26]:
arr_a = np.array([[1,2],[3,4]])
arr_b = np.array([[3,4],[5,6]])
# 그냥 곱연산
arr = arr_a * arr_b
print(arr)
# 행렬 곱 np.dot(A, B)
arr_dot = np.dot(arr_a,arr_b)
print(arr_dot)
# 이런식으로도 곱을 구할 수 있음 A.dot(B)
print(arr_a.dot(arr_b))
[[ 3 8]
[15 24]]
[[13 16]
[29 36]]
[[13 16]
[29 36]]
배열 슬라이싱¶
arr[start: end+1] 로 슬라이싱함
슬라이싱한 배열의 값 또한 변경시킬 수 있는데, 이때 배열의 크기가 다르면 변경할 수 없음. 그러나 브로드캐스팅 적용되는 선까지는 변경가능
In [27]:
arr = np.array([1,2,3,4,5,6,7,8,9])
# 바꾸기 전
print(arr[3:7])
# 바꾼 후
arr[3:7] = [1,2,3,4] # 4개의 배열이라 4개만 바꿔줘야함
print(arr[3:7])
# 브로드 캐스팅으로 바꿈
arr[3:7] = 100
print(arr[3:7])
[4 5 6 7]
[1 2 3 4]
[100 100 100 100]
2차원 배열 슬라이싱¶
In [30]:
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[1:3, 2:4]) # -> 첫번째 차원에서는 1~2 까지, 두번째 차원에서는 2부터 3까지 슬라이싱하자
[[6 7]
[7 8]]
슬라이싱을 이용한 값 변경¶
In [33]:
arr = np.array([
[1, 2, 3, 4, 5],
[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9],
[10, 11, 14, 15, 17]
])
# 값 변경
arr[1:3, 1:3] = np.array([[10, 20], [30, 40]])
print(arr)
# 브로드캐스팅도 가능함
arr[1:3, 1:3] = 100
print(arr)
[[ 1 2 3 4 5]
[ 4 10 20 7 8]
[ 5 30 40 8 9]
[10 11 14 15 17]]
[[ 1 2 3 4 5]
[ 4 100 100 7 8]
[ 5 100 100 8 9]
[ 10 11 14 15 17]]
관계 연산 (True , False)¶
and
나or
쓰면 에러남and
는&
로,or
은|
로 사용해야함
In [36]:
A = np.array([1, 2, 3, 4, 5, 4, 3, 2, 1])
# 1개의 조건식
B = (A >= 4)
print(B)
# 2개이상의 조건식
C = ((A >= 4) & (A % 2 == 1))
print(C)
[False False False True True True False False False]
[False False False False True False False False False]
불 인덱싱¶
- True인 애나 False인 애가 누구인지 알고싶지 않아?
In [37]:
# 위에 썼던 B를 그대로 쓰자
# bool 배열을 인덱스로 써서 그 요소를 추출하자
print(A[B])
# 또는 원하는 애들을 다 바꿔버릴 수 있지.
A[B] = 0 # B를 만족하는 애중애 A에있는 애들 싹다 쳐내
print(A)
[4 5 4]
[1 2 3 0 0 0 3 2 1]
'TIL > [겨울방학 부트캠프]TIL' 카테고리의 다른 글
TIL 17일차 (22.01.23) (0) | 2022.01.24 |
---|---|
TIL 16일차 (22.01.22) (0) | 2022.01.23 |
TIL 14일차 (22.01.19) (0) | 2022.01.20 |
TIL 13일 (22.01.18) (0) | 2022.01.18 |
TIL 12일차 (22.01.17) (0) | 2022.01.18 |