본문 바로가기

AI

부스트캠프 AI Tech 3기 Pre-Course [6]-2 Numpy : reshape, creation, operation, math, performance

reshape

array의 shape의 크기를 변경하는데, element의 갯수는 동일하다.

import numpy as np
a=np.array([[1,2,3,4],[2,3,4,5]])
print(a.shape)
# (2,4)

print(a.reshape(8,))
# >>[1 2 3 4 2 3 4 5]

print(a.reshape(-1,2))
# [[1 2]
#  [3 4]
#  [2 3]
#  [4 5]]

print(a.reshape(2,-1,2))
# [[[1 2]
#   [3 4]]
#
#  [[2 3]
#   [4 5]]]

어차피 정해진 element수는 계속해서 같기 때문에 나머지 하나를 -1 로 두면 알아서 남은 만큼으로 만들어준다.

이 코드에서는 a=a.reshape~~

이렇게 할당이 일어나지 않았기 때문에 a의 원본은 그대로 일 것이다.

 

flatten

다차원 array를 평평하게, 무엇이든 1차원으로 만든다.

reshape의 일종이다.

import numpy as np
a=np.array([[1,2,3,4],[2,3,4,5]])
a=a.flatten()
print(a)
>>[1 2 3 4 2 3 4 5]
print(a.shape)
>>(8,)

 

Indexing

list에서 [1][2]와 같이 썼던 것과 달리 [1,2]로 표기한다.

import numpy as np
a=np.array([[1,2,3,4],[6,7,8,9]])
print(a[0,2])
>> 3

a[0,0]=5
print(a)
# [[5 2 3 4]
#  [6 7 8 9]]

할당할 때도 마찬가지 이다.

 

Slicing

행과 열부분을 나눠서 slicing이 가능함 -> 부분집합 추출

import numpy as np
a=np.array([[1,2,3,4],[6,7,8,9]])
print(a[1,1:3])
>>[7 8]

1이상 3미만이기 때문에 1,2만 나오게 된다.

a[:3,:4]처럼 비우게 되면 처음부터로 인식된다 -> a[0:3,0:4]

ex) a[:,3] 이면 전체 행을 다 포함하겠다는 의미이다.

 

import numpy as np
a=np.array([[1,2,3,4],
            [6,7,8,9]])
print(a[1])
>>[6 7 8 9]
print(a[1:3])
>>[[6 7 8 9]]

print(a[:,::2])
# [[1 3]
#  [6 8]]

기법에 따라 dimension이 다르게 나온다.

starting point : end point : step이다.

 

creation function

arange

import numpy as np
a=np.arange(20).reshape(5,4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]
#  [12 13 14 15]
#  [16 17 18 19]]
print(np.arange(0,5,0.5).reshape(2,-1))
# [[0.  0.5 1.  1.5 2. ]
#  [2.5 3.  3.5 4.  4.5]]

(시작, 끝, step)으로 하되, step이 소수단위일 수 있다. 

 

 

ones, zeros, empty

import numpy as np
print(np.zeros(shape=(2,3), dtype=np.int8))
#[[0 0 0]
# [0 0 0]]
print(np.ones(shape=(3,2), dtype=np.int8))
#[[1 1]
# [1 1]
# [1 1]]
print(np.empty(shape=(3,), dtype=np.int8))
# [ 97 100 100]

ones는 그 array를 1로, zeros는 0으로 만든다.

empty는 그 공간을 잡되, 값은 초기화 하지 않아(memory initialization) 그 전에 사용했던 값들이 그대로 나온다.

 

something_like

import numpy as np
a=np.zeros(shape=(5,), dtype=np.int8)
print(a)
#[0 0 0 0 0]

a=np.ones_like(a)
print(a)
#[1 1 1 1 1]

해당 array의 크기만 똑같고 1로 채운다.

zeroes_like, empty_like도 있다.

 

identity

대각행렬이 1인 행렬 : 단위행렬 : i 행렬

import numpy as np
a=np.identity(n=2,dtype=np.int8)
print(a)
# [[1 0]
#  [0 1]]

정방행렬이기 때문에, shape 대신 n만 넣으면 된다.

 

eye

대각선이 1인 행렬, 대각선이 시작하는 값(k)을 정할 수 있다.

import numpy as np
a=np.eye(N=2,M=3,dtype=np.int8)
print(a)
# [[1 0 0]
#  [0 1 0]]

a=np.eye(N=2,M=3, k=1,dtype=np.int8)
print(a)
# [[0 1 0]
#  [0 0 1]]

 

diag

diagonal

생성되어있는 행렬에서 대각 행렬의 값만 추출한다.

import numpy as np
a=np.arange(12).reshape(3,4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

a=np.diag(a, k=1)
print(a)
# [ 1  6 11]

k로 어느 열부터 시작할 지 정할 수 있다.

 

random sampling

데이터 분포에 따른 sampling으로 array를 생성한다

  • uniform : 균등분포
    균등한 분포로 뽑아준다.
    uniform(시작, 끝, data size)
    import numpy as np
    a=np.random.uniform(0,1,10)
    print(a)
    # [0.29653061 0.68464162 0.0065098  0.70473052 0.92269823 0.02500788 0.49976667 0.30327223 0.76092845 0.88860467]​
  • normal : 정규분포
    import numpy as np
    a=np.random.uniform(0,1,10)
    print(a)
    # [0.67312758 0.10332668 0.31482339 0.84585658 0.65531673 0.11195735 0.75686535 0.05800135 0.38200236 0.84505769]​

 

Operation functions

axis

축 : operation function을 실행할 때 기준이 되는 dimension 축

새로생기는 축, 맨 마지막 차원이 axis 0이 된다.

sum

ndarray의 element의 합을 구해준다

import numpy as np
a=np.arange(1,11)
print(a.sum())
>>55

import numpy as np
a=np.arange(1,11).reshape(2,5)
print(a.sum(axis=0))
# [ 7  9 11 13 15]

print(a.sum(axis=1))
# [15 40]

mean(평균), std(표준편차) 같은 함수도 있다.

axis도 적용할 수 있다.

concatenate

numpy array 끼리 붙이는 함수

vstack과 hstack은 각각 vertical stack, horizontal stack이다.

import numpy as np
a=np.arange(1,4)
b=np.arange(4,7)
print(a,"----",b)
# [1 2 3] ---- [4 5 6]
print(np.concatenate((a,b), axis=0))
#[1 2 3 4 5 6]

 

Array operations

array간의 사칙연산 지원 :  element-wise여서 같은 위치의 값끼리 연산된다.

import numpy as np
a=np.arange(1,4)
b=np.arange(4,7)
print(a,"----",b)
# [1 2 3] ---- [4 5 6]
print(a+b)
#[5 7 9]
print(a-b)
#[-3 -3 -3]
print(a*b)
#[ 4 10 18]

 

dot product

a.dot(b)

 

transpose

전치행렬

a.T
a.transpose()

 

broadcasting

shape이 다른 배열 간 연산

퍼지면서 연산 된다.

scalar와 matrix 연산이 이에 해당된다.

scalar-matrix
vector-matrix/vector-vector

따로 함수가 있는 것은 아니고 연산하면 알아서 일어난다.

 

Numpy performance

코드의 퍼포먼스를  체크하는 함수 : %timeit

 

for loop < list comprehension < numpy

대용량 ======> numpy

 

 

 

 

Reference : 부스트캠프 AI Tech 3기 Pre-Course - Numpy