Part 3. Python Basics for AI
chapter 5) Numpy 2
네이버 AI 부스트캠프의 Pre-course 수업을 듣던 중 공부한 내용을 정리하고, 추가적으로 따로 공부한 부분이 생기면 함께 필기했습니다.
대부분의 캡쳐, 정보는 부스트캠프 강의에서 얻었으며 오직 개인 공부의 목적으로 포스팅합니다.
강의 링크는 여기에
test_matrix = [[1,2,3,4], [1,2,5,8]]
np.array(test_matrix).shape
# >> (2, 4)
이를 reshape 하면
np.array(test_matrix).reshape(8,)
# >> array([1, 2, 3, 4, 1, 2, 5, 8])
이렇게 한줄로 변함.
np.array(test_matrix).reshape(-1,2).shape
a = np.array([[1, 2, 3], [4.5, 5, 6]], int)
print(a)
print(a[0,0]) # 0번째 row, 0번째 column = 1
print(a[0][0]) # 위와 동일
a[0,0] = 12 # Matrix 0,0에 12 할당
a = np.array([[1,2,3,4,5],[6,7,8,9,10]],int)
a[:,2:] # 전체 행(row)의 2열(column)이상 = [3,4,5],[8,9,10]
a[1,1:3] # 1행의 1열 ~ 2열 = 7,8
a[1:3] # 1행 ~ 2행의 전체 = 6,7,8,9,10. 2행은 없으므로 1행만 보여줌.
a = np.arange(100).reshape(10,10)
# 100개의 element를 10행 10열의 모양에 넣어라.
a[:, -1]
# 전체 행, 맨 마지막 열
# >> array([9, 19, 29, 39, 49, 59, 69, 79, 89, 99])
np.arrange(0, 5, 0.5)` => (시작, 끝, step)
\>> array([0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5])
# floating point도 표시 가능
list(range(0,10,3))
# >> [0, 3, 6, 9]
np.array(30).reshape(5, 6)
# 0부터 29까지 30개의 원소를 5행 6열로
np.zeros(shape, dtype, order)
>np.zeros(shape=(10,), dtype=np.int8) #10 - zero vector 생성.
# >> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype =int8)
np.zeros((2,5))
# 2 by 5 - zero matrix 생성. shape 파라미터가 기본.
np.ones(shape, dtype, order)
>test_matrix = np.arange(30).reshape(5,6)
# 0~29까지 5,6의 쉐이프로 만듬.
np.ones_like(test_matrix)
# 위에서 만든 test_matrix와 같은 모양의 ones를 만듦.(ones 기능)
np.identity(n, dtype, order)
, dtype과 order은 optional>np.eye(n, m, k)
, m과 k는 optional># 균등분포
np.random.uniform(0,1,10).reshape(2,5)
# (시작값, 끝값, 데이터 갯수)
# 정규분포
np.random.normal(0,1,10).reshape(2,5)
# 가장 많이 쓰이는 것중 하나인 exponential 분포
np.random.exponential(scale=2, size=100)
<기본 형식 : array name.sum()
>
ndarray의 element들 간의 합을 구함, list의 sum 기능sum(list name)
과 동일
예시
test_array = np.arange (1,11)
# array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
test_array.sum(dtype=np.float)
# 55.0
모든 operation function을 실행할 때 기준이 되는 dimension 축
괄호 순으로 생각하면 쉬움. (3, 4) = (axis = 0일때 기준(세로), axid = 1일때 기준(가로))
axis = 0 : 행 방향(1행, 2행, 3행... 이렇게 '행의 개수' 세는 방향), axis = 1 : 열 방향(1열, 2열, 3열..이렇게 '열의 개수' 세는 방향)
갑자기 행방향 열방향이 너무 헷갈렸다... 설명해주는 참고 링크
<기본 형식 : test_array.sum(axis=1), test_array.sum(axis=0)
>
<기본 형식 : third_order_tensor_name.sum(axis=0)
>
그 외에도 다양한 수학 연산자를 제공함 (np.something 호출)
exponential : exp, expml, exp2, log, logl0, loglp, log2,power, sqrt
trigonometric : sin, cos, tan, acsin, arccos, atctan hyperbolic : sinh, cosh, tanh, acsinh, arccosh, atctanh
이런 모양의 array는 b인 [5, 6]도 Dimension의 모양을 바꾸어줘야하는데, (위의 그림에서 보라색 선) 이때, newaxis 함수를 이용해 축을 추가할 수 있다. 더 자세한 설명 링크 (newaxis는 축 추가만 하는데 채워가며 축 추가하는 tile의 설명도 되어있음)
array_name.reshape(-1,2) 를 해도 2열 기준으로 생성되니 맞춰지긴 함.
일반적으로 속도는 아래 순
for loop < list comprehension < numpy
100,000,000 번의 loop이 돌 때, 약 4배 이상의 성능 차이를 보임
Numpy는 C로 구현되어 있어, 성능을 확보하는 대신 파이썬의 가장 큰 특징인 dynamic typing을 포기함
대용량 계산에서는 가장 흔히 사용됨-Concatenate 처럼 계산이 아닌, 할당에서는 연산 속도의 이점이 없음