numpy 정리

2021. 8. 18. 21:24python/pandas, numpy

728x90

# Numpy 

# 0차원(scala)[숫자]1차원데이터(vector) 혹은 2차원데이터(matrix)를 다루기 쉽게 도와주는 module
# Machine Learning, Deep Learning의 기본 자료구조로 Numpy의 ndarray가 사용
# n-dimensional array(ndarray)를 이용해요!

# numpy(외부모듈)를 사용하기 위해서는 module을 설치해야 해요!

ndarray를 생성하는 방법
# 1. python의 list를 가지고 ndarray를 만들어요! => np.array()
#    ndarray의 가장 큰 특징 중 하나는... 모든 개별적인 요소들이 같은 data type을 
#    가져요! default는 float
#    - ndarray가 가지는 여러가지 속성
#      dtype : ndarray안에 저장되어 있는 데이터의 type
#      ndim : ndarray의 차원의 수를 알려줘요!
#      shape : tuple로 표현되고 차원의 수와 각 차원의 요소수를 알려줘요!

#       size   : 요소의 갯수를 알려준다

          

 

난수 : 정해진 범위 내에서 규칙 없이 만들어진 수 == random

  표준편차 : 정규분포 평균값 +-n사이 많은값이 모여있다?

 정규분포 :  산처럼 생긴 그래프이며 중앙에 값들이 몰려있다

표준 정규분포 : 평균이 0이고 표준편차가 1인 정규분포

 

 

 


# 2. numpy가 제공하는 몇몇개의 함수가 존재

#    astype() int32형태의 ndarray로 변경하고 싶다 (result = arr.astype(np.int32))
#    np.ones(), np.zeros(), np.full(), np.empty()

#    np.full((3,4), 9.)    #내가 원하는 값으로 채운다 , 보기는 9.로 채운다
#    np.ones_like()   -   기존 있는 array 에서 동일한 shape으로 만들어라
#    np.arange()     -     파이썬의 range
#    np.linspace()    -     start에서 stop까지 범위에서 num개를 균일한 간격으로 원소를 생성하고 배열을 만들어요 :            np.linspace(start,stop,num)


#    ndarray를 만들고 그 안에 값을 난수(random)로 초기화하기 위해서는 어떻게 해야 하나요?
#    5가지 함수
#    np.random.normal()      -        정규분포 확률밀도함수에서 실수 표본을 추출
#    np.random.rand()         -        0 이상 1미만의 균등분포 확률밀도함수에서 실수 표본을 추출

#    np.random.randn()       -         표준 정규분포상에서 실수 표본을 추출해서 ndarray를 생성

#    np.random.random()    -          0이상 1미만의 균등분포에서 실수형 난수(random)를 추출해서 ndarray를 생성

#    np.random.randint(low, high, shape)   -      최소값과 최대값 사이에서 정해진 shape으로 난수를 추출해서
#                                                             ndarray를 생성 => 균등분포를 이용해서 난수(정수) 추출

 


#    seed(n)처리               -      난수값을 도출/ 초기값이 없으면 랜덤값이 계속 바뀌지만 초기값이 잇으면 고정 값은 어                                           떤 수도 상관 없다 seed(n)    /    np.random.seed(3)

#    shuffle()처리,            -      random 데이터의 순서를 바꾸려면 어떻게 해야 하나요?? => shfflue() => ndarray 원본이 변경 

#    sampling()처리         -      데이터 집합에서 일부를 무작위로 sampling을 수행하기 위해서 사용하는 choice()

                        # numpy.random.choice(n, size, replace, p)
# n : ndarray, 혹은 정수가 나오면 arange()를 수행한 결과
# size : sample 개수
# replace=True : 한번 뽑은걸 다시 뽑을 수 있어요! 중복으로 뽑을수 있다라는 뜻
# ndarray => p=[0.1, 0.3, 0, 0.1, 0.1, 0.35, 0.05]   확률

 


# 3. ndarray를 사용하기 위해 필수적으로 알아야 하는 속성과 함수
#    reshape()   => shape을 다시만들어 view처리
#    ravel() => 무조건 1차원으로 만들어요! => view
#    resize() => reshape()은 요소의 수가 맞지 않으면 shape이 변경되지 않아요!
#                요소의 수가 맞지 않아도 shape을 변경할 수 있어요! => view X

#    copy()    # view가 아니라 별도의 ndarray를 만들고 싶어요!

 

 


# 4. ndarray의 제어

indexig은 차원이 준다[n]

slicing은 차원을 유지[n:n]   ndarray에 대해서 slicing을 하면 view가 만들어져요!!

[ , ] 기준으로 행과 열이 변경


print(arr[1,2])   #6       2차원 ndarray의 indexing(1행2열)

print(arr[2,:])   #[7, 8, 9]      1차원의 ndarray가 결과로 나와요(view)

print(arr[1:3,:])   # [[4, 5, 6]  [7, 8, 9]] 결과값이 2차원이므로 주의

 

fancy indexing  -  리스트형태로 만들어서 해당 값 위치에서 값을 가져온다 / fancy indexing은 차원을 유지

print(arr[[0, 2, 3]]

fancy indexing을 내부구조상 2번 사용할수 없다!! : np.ix_([0,2][0,2]) 를 이용해 사용 가능

print(arr[np.ix_([0,2],[0,2])]) # 이렇게 사용해야 해요!    ==  print(arr[[0,2]][:,[0,2]])

 

 Boolean Indexing 

Boolean Mask안에서 True로 지정된 요소만 indexing하는 방식. 

 arr[arr % 2 == 0]   

   arr이 가진거중에 []를 계산하여 짝수만 나온다 / (데이터가 많은상태로 if 문이라면 하루종일 걸린다)



# 5. ndarray의 연산(사칙연산같은거..)
#    같은 shape을 가지는 ndarray끼리 연산이 가능하고 같은 위치에 있는 요소들끼리
#    연산이 수행
#    만약 shape이 다른경우 자동으로 shape을 맞추기 위해서 ndarray를 변형 => broadcasting

arr = np.arange(0,5,1)
arr2 = np.arange(10,13,1)
print(arr + 1)각 값에 1씩 더한다
[0 1 2 3 4]
[1 1 1 1 1]

위 상황에서 print(arr + arr2)

arr2가 3개면 +2를 못하므로 불가능

만약 arr1이 6개면 arr2값 * 2로 가능하다



행렬곱연산 ( matrix multiplication : 매트릭스 곱하기)

np.matmul(행렬곱) 연산에서는 broadcasting이 발생하지 않아요!
# 앞쪽행렬의 열의 개수와 뒤쪽 행렬의 행의 개수가 같아야 행렬곱 연산이 성립!



# 6. ndarray 반복처리하려면 어떻게 해야 하나요?
#    for, while을 이용해도 되요!
#    iterator를 이용한 while문을 사용해서 반복처리를 해야 해요!

 

2차원 ndarray

it = np.nditer(arr, flags=['multi_index'])

 

while not it.finished:
    
    idx = it.multi_index            # (1,0)
    
    print(arr[idx], end=' ')
    
    it.iternext()

 



# 7. ndarray는 집계함수를 제공해줘요!

# print(arr)

[[1 2 3][4 5 6]]

# # print(arr.sum())
# print(np.sum(arr))   # 합
# print(np.mean(arr))  # 평균
# print(np.max(arr))  # 최대값
# print(np.min(arr))  # 최소값
# print(np.argmax(arr))  # 최대값을 찾아서 그 최대값의 index / 2차원이라도 1차원으로 만들어 몇번째인지
# print(np.std(arr))  # 표준편차


#    axis개념.

 1차원인 경우 축의 번호는 0이고 이때 0의 의미는 열 (열 방향)

 2차원인 경우 축의 번호는 0과 1을 쓸 수 있고 0이 행, 1이 열

print(arr.argmax(axis=1))          # [2 2 2]

 

'python > pandas, numpy' 카테고리의 다른 글

dataframe으로 json이용  (0) 2021.08.19
pandas 기초  (0) 2021.08.19
numpy 3일차  (0) 2021.08.18
numpy 2일차  (0) 2021.08.18
numpy 1일차  (0) 2021.08.17