HappyWeasel

파이썬 - Numpy 본문

Basic/Python

파이썬 - Numpy

HappyWeasel 2020. 6. 5. 20:34

Numerical Python

  • Python에서 대규모 다차원 배열을 다룰 수 있게 도와주는 라이브러.
  • 파이썬 리스트로도 계산 할 수 있지만 numpy는 list에 비해서 빠른 연산을 지원하고
    메모리를 효율적으로 사용한다.
  • 리스트와 다르게 array는 단일 타입으로 구성된다.
list(range(10))
# [0,1,2,3,4,5,6,7,8,9]

import numpy as np

np.array([1,2,3,4,5])
#리스트를 array로 변환
#array([1,2,3,4,5])

 

배열 만들기

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

np.array([3, 1.4, 2, 3, 4])
# array([3. , 1.4 , 2. , 3. , 4.])
# 리스트 원소 중에 실수가 있으면 모든 원소는 실수가 된다.

np.array([1, 2, 3, 4], dtype='float')
# array([1. , 2. , 3. , 4. ])

arr = np.array([1, 2, 3, 4], dtype='float')
arr.dtype  
#아래와 같이 출력
# dtype('float64')

arr.astype(int)
# int로 데이터 타입 변경
# array([1, 2, 3, 4])

 

배열 데이터 타입 dtype

dtype 설명 다양한 표현
int 정수형 타입 i, int_, int32, int64, i8
float 실수형 타입 f, float_, flaot32, float64, f8
str 문자열 타입 str, U, U32
bool 부울 타입 ?, bool_

 

np.zeros(10, dtype=int)
# 0으로 10개의 원소를 생성
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

np.ones((3,5), dtype=float)
'''
1로 다중 배열 생성 (3X5배열)
array([[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]])
'''

np.arange(0, 20, 2)
# 0 ~ 20까지 2씩 증가하는 원소 생성
# array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18 ])

np.linspace(0, 1, 5)
# 0 ~ 1사이를 5개로 나눠서 생성
# array([0., 0.25, 0.5, 0.75, 1.])

 

난수로 채워진 배열 만들기

np.random.random((2,2))
'''
랜덤으로 2X2 배열 요소를 생성
 array([[0.1321545646, 0.81131345324],
         [0.8441541561, 0.15649849545]])
 '''
 
 np.random.normal(0, 1, (2, 2))
 # 정규분포로 데이터를 뽑아낸다.
 # 평균이 0이고 표준편차가 1인 2X2배열을 생성한다.
 '''
 array([[ 0.44050683, 0.04912487]],
          [ -1.67023947, -0.70982067]])
 '''
 
 np.random.randint(0, 10, (2, 2))
 # int 타입으로 2X2 배열 생성
 '''
 array([[3, 9],
        [3, 2]])
 '''  

 

배열의 기초

x2 = np.random.randint(10, size = (3, 4))
'''
array([[2, 2, 9, 0],
         [4, 2, 1, 0],
         [1, 8, 7, 3]])
'''

# 행렬의 속성을 알 수 있다.
x2.ndim     # 2                2차원 배열이다.
x2.shape    # (3, 4)           3X4 배열이다.
x2.size     # 12               원소가 몇 개 들어있는지.
x2.dtype    # dtype('int64')   타입을 알 수 있다.

 

찾고 잘라내기

x = np.arange(7)
# array([0, 1, 2, 3, 4, 5, 6])

x[3]
# 3

x[7]
# IndexError: index 7 is out of bounds

x[0] = 10
# array([10, 1, 2, 3, 4, 5, 6])

x[0] = 0

x[1:4]
# array([1,2,3])

x[1:]
# array([1,2,3,4,5,6])

x[:4]
# array([0,1,2,3])

x[::2]
# 2씩 건너 뛰면서 출력
# array([0,2,4,6])

 

모양 바꾸기

  • reshape : array의 shape을 변경한다.
x = np.arange(8)
'''
array([0,1,2,3,4,5,6,7])
'''

x.shape
# (8,)

x2 = x.reshap((2, 4))
# 배열의 모양을 바꾼다.
'''
array([[0,1,2,3],
       [4,5,6,7]])
'''

x2.shape
# (2,4)

 

  • concatenate : array를 이어 붙인다.
x = np.array([0,1,2])
y = np.array([3,4,5])

np.concatenate([x, y])
#array([0, 1, 2, 3, 4, 5])


matrix = np.arange(4).reshape(2, 2)

# axis 축을 기준으로 이어 붙일 수 있다.
# 0 : y축 / 1 : x축

np.concatenate([matrix, matrix], axis=0)

'''
[[0,1],
 [2,3]]
 
 아래와 같이 변경 된다.
 
 [[0,1],
  [2,3],
  [0,1],
  [2,3]]
'''
 
 np.concatenate([matrix, matrix], axis=1)
'''
[[0,1],
 [2,3]]
 
 아래와 같이 변경 된다.
 
 [[0,1,0,1],
  [2,3,2,3]]
'''

 

  • 나누기
matrix = np.arange(16).reshape(4,4)


upper, lower = np.split(matrix, [3], axis=0)
'''
[[0,1,2,3],
 [4,5,6,7],
 [8,9,10,11],
 [12,13,14,15]]
 
 아래처럼 나눠준다.
 
 [[0,1,2,3],
 [4,5,6,7],
 [8,9,10,11]]
 
 
 [12,13,14,15]
  
'''
 
 upper, lower = np.split(matrix, [3], axis=1)
'''
[[0,1,2,3],
 [4,5,6,7],
 [8,9,10,11],
 [12,13,14,15]]
 
 아래처럼 나눠준다.
 
 [[0,1,2],
  [4,5,6],
  [8,9,10]
  [12,13,14]]
  
 [[3],
  [7],
  [11],
  [15]]
  
'''

 

루프는 느리다

def add_five_to_array(values):
	output = np.empty(len(values))
    for i in range(len(values)):
    	output[i] = values[i] + 5
    return output

big_array = np.random.randint(1, 100, size = 1000000000)

add_five_to_array(big_array)
# 느리다

big_array + 5
# 빠르다

 

  • 기본 연산을 지원한다.
x = np.arange(4)
# array([0,1,2,3])

x + 5
# array([5,6,7,8])

x - 5
# array([-5,-4,-3,-2])

x * 5
# array([0, 5, 10, 15])

x / 5
# array([0. , 0,2, 0.4, 0.6])

 

  • 행렬간 연산
x = np.arange(4).reshape((2,2))
y = np.random.randint(10, size=(2,2))

x+y
'''
array([[1,7],
       [6,5]]))
'''

x-y
'''
array([[-1,-5],
       [-2,1]])
'''

 

브로드캐스팅

  • Broadcasting: shape이 다른 array끼리 연산을 지원
import numpy as np

'''
[[0]
 [1]
 [2]
 [3]
 [4]
 [5]] 배열 A와

 [0 1 2 3 4 5] 배열 B를 선언하고, 덧셈 연산해보세요.
'''

A = np.arange(6).reshape(6,1)
B = np.arange(6)

print(A + B)

 

집계함수

  • 집계: 데이터에 대한 요약 통계를 볼 수 있다.
x = np.arange(8).reshape((2,4))

np.sum(x)
# 모든 원소의 합 : 28

np.min(x)
# 최솟값 : 0

np.max(x)
# 최대값 : 7

np.mean(x)
# 평균 : 3.5

np.std(x)
# 표준편차
x = np.arange(8).reshape((2,4))

np.sum(x, axis=0)
# y축으로 덧셈
# array([ 4, 6, 8, 10])

np.sum(x, axis=1)
# x축으로 덧셈
# array([6, 22])

 

마스킹연산

  • True, False array를 통해서 특정 값들을 뽑아내는 방법
x = np.range(5)
# array([0, 1, 2, 3, 4])

x < 3
# array([ True, True, True, False, False])

x > 5
# array([False, False, False, False, False])

x[x < 3]
# index 자리에 조건식을 넣으면 조건이 True인 array 원소를 반환한다.
# array([0, 1, 2])

 

import numpy as np

daily_liar_data = [0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0]


# 양치기 소년이 거짓말을 몇 번 했는지 구하여 출력해주세요.

def main() :
    # 해당하는 코드 작성
    liar_array = np.array(daily_liar_data)
    print(len(liar_array[liar_array == 0]))
    print(np.count_nonzero(liar_array==0))

if __name__ == "__main__" :
    main()

 

np.count_nonzero : none이거나 false가 아닌 데이터를 카운터 해주는 함수

'Basic > Python' 카테고리의 다른 글

파이썬 - Pandas 2  (1) 2020.06.29
파이썬 - Pandas 1  (1) 2020.06.06
파이썬 - filter  (0) 2020.06.05
파이썬 - map  (0) 2020.06.05
파이썬 - lambda  (0) 2020.06.04
Comments