본문 바로가기

[Python]

[Python] Numpy 기본

배열 데이터를 효과적으로 다루는 NumPy

 

시퀀스 데이터로부터 배열 생성

import numpy as np
data1 = [0, 1, 2, 3, 4, 5]
a1 = np.array(data1)

2차원 배열 생성 방법

np.array([[1,2,3], [4,5,6], [7,8,9]])


a2 = np.arange(10, 100, 10).reshape(3,3)
# array([[10, 20, 30],
#        [40, 50, 60],
#        [70, 80, 90]])

범위를 지정한 배열 생성

np.arange(0, 10, 2)
np.arange(1, 10) #step 생략
np.arange(5) #start , step 생략

reshape를 추가해 1차 배열을 2차 배열로 변경하기

np.arange(12).reshape(4,3) # 배열의 원소 개수와 reshape(m, n)의 m * n의 개수가 같아야 함

배열의 형태 출력 

# 2차원 배열의 경우
b1 = np.arange(12).reshape(4,3)
b1.shape # (4,3)

# 1차원 배열의 경우
b2 = np.arange(5)
b2.shape # (5,)

 

범위의 시작과 끝을 지정한 후 데이터의 개수를 지정해 Numpy 배열 생성

1. 시작과 끝 길이가 지정 데이터의 개수와 같을때

np.linspace(1, 10 , 10)
# array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

2. 시작과 끝 길이가 지정한 데이터의 개수와 다를때

np.linspace(0, np.pi, 10 )
# array([0.        , 0.34906585, 0.6981317 , 1.04719755, 1.3962634 ,
      # 1.74532925, 2.0943951 , 2.44346095, 2.7925268 , 3.14159265])

모든 원소가 0 과 1인 다차원 배열을 만들기 위해서는 zeros()와 ones() 사용

np.zeros(10) # 1차원 10개
np.zeros((3,4)) # 2차원 총 12개 원소

np.ones(5) # 1차원
np.ones((3,5)) # 2차원

단위 행렬 생성 = n*n인 정사각형 행렬에서 주 대각선이 모두 1이고 나머지가 0인 행렬

np.eye(3)
# array([[1., 0., 0.],
#        [0., 1., 0.],
#        [0., 0., 1.]])

문자열이 원소인 Numpy 배열

np.array(['1.5', '0.62', '2', '3.14', '3.141592'])
# array(['1.5', '0.62', '2', '3.14', '3.141592'], dtype='<U8')

배열의 형변환 문자열>>실수

str_a1 = np.array(['1.567', '0.123', '5.123', '9', '8'])
num_a1 = str_a1.astype(float)
num_a1
# array([1.567, 0.123, 5.123, 9.   , 8.   ]) 실수형으로 변환

배열의 형변환 실수>>정수

num_f1 = np.array([10, 21, 0.549, 4.75, 5.98])
num_i1 = num_f1.astype(int)
num_i1
# array([10, 21,  0,  4,  5])

난수 배열의 생성

rand() = 0과 1 사이의 실수 난수를 갖는 Numpy 배열 생성

# 0~1사이의 2행3열 배열
np.random.rand(2,3)
# array([[0.08420555, 0.57055973, 0.27258145],
#        [0.3684193 , 0.81675464, 0.03088455]])

# 3차원 배열 (뒤에서부터 4개짜리 3개 >> 3개짜리 2개)
np.random.rand(2,3,4)
# array([[[0.12604778, 0.58087328, 0.93390461, 0.71172255],
#         [0.13341364, 0.76434279, 0.1081062 , 0.1690872 ],
#         [0.36756175, 0.35144066, 0.58077276, 0.56255779]],
# 
#        [[0.37467747, 0.16625662, 0.38109622, 0.81327819],
#         [0.07048931, 0.36569228, 0.10417258, 0.33516825],
#         [0.51510411, 0.82097616, 0.92401257, 0.64208011]]])

randint() = [low,high] 사이의 정수 난수를 갖는 배열 생성

np.random.randint(1, 30) 
# 1~30까지

np.random.randint(46, size=(3, 2)) # 사이즈를 지정하지 않으면 1
# 1~46 까지 랜덤 정, 2개 특성을 가진 리스트 3개
# array([[26, 33],
#        [ 4, 27],
#        [15, 24]])

 

통계를 위한 연산

 

합계sum()와 평균mean()

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

[arr3.sum(), arr3.mean()]
# [10, 2.0]

표준편차std()와 분산var()

표준편차 = 평균을 중심으로 퍼져있는 정도

분산 = 변량이 평균으로 부터 떨어져 있는 정도

[arr3.std(), arr3.var()]
# [1.4142135623730951, 2.0]

최솟값 min(), 최댓값 max(), 누적합cumsum(), 누적곱, cumprod()도  연산 가능

 

 

배열의 슬라이싱

2차 배열에서의 슬라이싱

b2 = np.arange(10, 100, 10).reshape(3,3)
# array([[10, 20, 30],
#        [40, 50, 60],
#        [70, 80, 90]])

b2[1:3, 1:3] # [행시작:행끝, 열시작:열끝]
b2[:3, 1:]
b2[1][0:2] # 행을 지정하고 열을 슬라이싱
b2[0:2,1:3] = np.array([[25, 35], [55, 65]]) # 슬라이싱 된 배열에 값 지정하기

 

행렬곱, 전치행렬, 역행렬, 행렬식