본문 바로가기
Tech-Pyhton

Numpy 요약 정리

by redcrow 2020. 4. 4.


1. numpy 왜 사용해야하나?


NestedList = [[11,12,13],[21,22,23],[31,32,33]]


위와 같은 List가 있을 때,  각 원소에 1을 더하려면 어떻게 해야 할까?


numpy를 모르고 있다면 아래처럼 Looping  처리하면서 각 원소에 1을 더해야 한다.


NestedList = [[11,12,13],[21,22,23],[31,32,33]]

NestedList2 = []

for list in NestedList:

    tempList= []

    for i in list:

        tempList.append(i +1)

    NestedList2.append(tempList)


이런 코드량을 견딜 수 없어 Numpy라는 사기 라이브러리 등장.

Array로 만들어서 1만 더하면 됨.


import numpy as np

NestedList = [[11,12,13],[21,22,23],[31,32,33]]

array = np.array(NestedList)

array = array +1

print(array)


물론 이것 외에도 파워풀 기능이 많음



2. numpy 기초1


numpy를 사용하기 위해서는 "import numpy as np" 로 import


numpy 설치는 이전글 참조


1) 배열 만들기


import numpy as np

# 아래 두 구문은 동일 결과

print(np.array([0,1,2,3,4]))

print(np.array(list(range(5))))

# [0 1 2 3 4]


print(np.array([[1, 2],[3, 4]]))               # 2차원 배열

# [[1 2]

#  [3 4]]


array1 = np.array([1, 2, 3, 4])    # array는 하나의 데이터 타입만 가능

print(array1.dtype)                  # int32

array2 = np.array([1, 2.0, 3, 4])  # 하나의 데이터 타입으로 다른 데이터의타입을 변경한다. (implicit type conversion)

print(array2.dtype)                  # float64

array3 = array2.astype(int)       # 강제 타입 변경 (explicit type conversion)


print(np.array([1, 2, 3, 4], dtype='float') ) # 데이터타입지정

# [1. 2. 3. 4.]



print(np.zeros(10, dtype=int))      # 0이 들어있는 배열생성

# [0 0 0 0 0 0 0 0 0 0]


print(np.ones( (2,3) , dtype=int))  # 1이들어 있는 배열생성. 2 x 3

# [[1 1 1]

#  [1 1 1]]


print(np.empty((2,3)))                # 초기값으로 생성. 초기값은 랜덤

# [[ 4.64583300e-308  4.66664552e-308 -2.57703408e+010]

#  [-4.70231646e-064  2.26262303e-319  1.42419802e-306]]


print(np.full((2,3),255))               #  초기값을 지정해서 생성

# [[255 255 255]

#  [255 255 255]]


print(np.arange(10, 0, -2))          #  range 함수와 유사한 배열에서의 함수 : arange

# [10  8  6  4  2]


print(np.linspace(0, 1, 5))           # 두 숫자사이를 나눔

# [0.   0.25 0.5  0.75 1.  ]


print(np.random.random((2,3)))    # 난수 생성

# [[0.18483957 0.26520271 0.57003289]

#  [0.79006366 0.22874932 0.38941764]]


print(np.random.normal(0,1,(2,3)))  # 정규분포로부터 무작위 샘플 생성.binomial(이항분포), poisson(포아송분포)도 있음


# [[ 0.44756887  1.12639652  0.12393961]

#  [ 0.33699117 -0.85292837  0.63258767]]


print(np.random.randint(0,100,(2,3)))  # row와 high 사이의 정수형태의 난수

# [[93 35 70]
#  [85 12 68]]



2) 배열의 속성


array1 = np.full((2,3),255) 

print(array1.ndim)                          # dimension. 2

print(array1.shape)                         # shape (2,3)


3) 배열의 조작1


배열의 기본 조작은 List와 유사


array1 = np.arange(10)                   # [0 1 2 3 4 5 6 7 8 9]


print(array1)                                 # [0 1 2 3 4 5 6 7 8 9]

print(array1[0],array1[5],array1[7])      # 0 5 7

print(array1[2:4])                           # [2 3]

print(array1[1:])                            #  [1 2 3 4 5 6 7 8 9]

print(array1[:5])                            # [0 1 2 3 4]

print(array1[::2])                           # [0 2 4 6 8]

print(array1[::2])                           # [9 7 5 3 1]


4) 배열의 조작2 


배열을 붙이고 자르기


## array 모양변경하기

array1 = np.arange(10)

array2 =  array1.reshape((2,5))

print(array2)

# [[0 1 2 3 4]

#  [5 6 7 8 9]]

print(array2.shape)   # (2, 5)


## array 이어붙이기

array1 = np.array([1,2,3])

array2 = np.array([4,5,6])

print(np.concatenate([array1, array2]))  # [1 2 3 4 5 6]


## matrix  이어붙이기 - 세로로 붙이기

array1 = np.array([1,2,3,4]).reshape((2,2))

array2 = np.concatenate([array1,array1], axis = 0)

print(array2)

# [[1 2]

#  [3 4]

#  [1 2]

#  [3 4]]


## matrix  이어붙이기 - 가로로 붙이기

array3 = np.concatenate([array1,array1], axis = 1)

print(array3)

# [[1 2 1 2]

#  [3 4 3 4]]



## matrix   가로축으로 나누기

upper , lower = np.split(array2,[3], axis=0) #index 3행기준으로 나누기

print(upper)

# [[1 2]

#  [3 4]

#  [1 2]]


print(lower)

# [[3 4]]


## matrix   세로축으로 나누기

left , right = np.split(array3,[3], axis=1)   #index 3열기준으로 나누기

print(left)

# [[1 2 1]

#  [3 4 3]]


print(right)

# [[2]

#  [4]]




3. numpy 연산


numpy를 사용하기 위해서는 "import numpy as np" 로 import


1) 기본연산 ( + ,-,*,/ )


array1 = np.array([1,2,3,4,5,6])

print(array1 + 5)

# [ 6  7  8  9 10 11]


print(array1 - 5)

# [-4 -3 -2 -1  0  1]


print(array1 * 5)

# [ 5 10 15 20 25 30]


print(array1 / 5)

# [0.2 0.4 0.6 0.8 1.  1.2]


array2 = array1.reshape((2,3))

print(array2)

# [[1 2 3]

#  [4 5 6]]


array3 = array2 + 5

print(array3)

# [[ 6  7  8]

#  [ 9 10 11]]


print(array2 + array3)

# [[ 7  9 11]

# [13 15 17]]


2) 브로드캐스팅


shape가 서로 다른 array끼리의 연산은 broadcasting이 발생

단 열이나, 형의 크기가 같아야 연산이 가능



array1 = np.array([1,2,3,4,5,6])

array2 = array1.reshape((2,3))

print(array2)

# [[1 2 3]

#  [4 5 6]]


print(array2 + 5)

# [[ 6  7  8]

#  [ 9 10 11]]


print(array2 + np.array([1,2,3]))  

# [[2 4 6]

#  [5 7 9]]


print(array2  + np.array([4,5]).reshape((2,1))) 

# [[ 6  8 10]
#  [10 12 14]]

print(np.array([1,2,3]) + np.array([4,5,6,7]).reshape((2,2)))  
# 행,열 모두 shape가 다르므로 error


3) 집계함수


array1 = np.random.normal(0,1,(1000,1000))

print(np.sum(array1) )  # 합산

print(np.min(array1))    # 최소

print(np.max(array1))    # 최대

print(np.mean(array1))  # 평균

print(np.std(array1))     # 표준편차

print(np.var(array1))      # 분산


array1 = np.arange(10).reshape((2,5))

print(array1)

# [[0 1 2 3 4]

#  [5 6 7 8 9]]


print(np.sum(array1, axis=0)) # 열 합계

# [ 5  7  9 11 13]


print(np.sum(array1, axis=1)) # 행 합계

# [10 35]



4.  기타


1) 특정 데이터의 갯수 확인하기


array_data = np.array([1,1,2,3,3,3,3,4,5,5])

# 데이터가 3인 element 갯수 구하기 1

print(array_data == 3)

# [False False False  True  True  True  True False False False]


print(array_data[array_data == 3])

# [3 3 3 3]


print(len(array_data[array_data == 3]))

# 4


# 데이터가 3인 element 갯수 구하기 2

print(np.count_nonzero(array_data == 3))   # True 1 , False =0

# 4



'Tech-Pyhton' 카테고리의 다른 글

Heap with Python (파이썬으로 힙 자료구조 이용하기)  (1) 2020.08.09
Pandas 기초 1  (0) 2020.04.05
Numpy 설치하기  (1) 2019.12.25
[Python] Dictionary  (0) 2019.03.27
[Python] Map, Filter, Zip  (0) 2019.03.27

댓글