[판다스 기초] Numpy로 Array 연산 (Matrix, Vector, 선형대수 계산)
Numpy
Numerical Python : Array 연산을 지원하는 패키지 (Matrix, Vector 등 사용하는 선형대수 계산)
import numpy as np
Numpy Array 만들기
Simple Array
a = np.array([8,9,12,10])
print(a)
[ 8 9 12 10]
np.arange()
np.arange(5) # range와 동일 - 0 ~ 4까지
array([0, 1, 2, 3, 4])
다차원 Array
# 2차원 배열 (3행 x 2열)
a = np.array([[1,2], [3,4],[5,6]])
print(a)
[[1 2]
[3 4]
[5 6]]
print(a.ndim) # 몇 차원인지
print(a.shape) # 몇 행 x 몇 열인지
print(len(a)) # 행의 개수
2
(3, 2)
3
a = [[12, 13, 14, 15],[4, 5, 6, 7],[20, 21, 22, 23]]
b = [[0, 1, 2, 3],[16, 17, 18, 19],[8, 9, 10, 11]]
c = np.array([a, b])
print(c)
print(c.ndim) # 3차원
print(c.shape) # 2개 x 3행 x 4열
print(len(c)) # 전체 array안의 개수
[[[12 13 14 15]
[ 4 5 6 7]
[20 21 22 23]]
[[ 0 1 2 3]
[16 17 18 19]
[ 8 9 10 11]]]
3
(2, 3, 4)
2
zeros ones eye diag
print(np.zeros((2,3))) # 0으로 채운 2행 x 3열
[[0. 0. 0.]
[0. 0. 0.]]
np.zeros((2,3)).dtype # 데이터타입은 float
dtype('float64')
print(np.ones((2,3))) # 1로 채운 2행 x 3열
[[1. 1. 1.]
[1. 1. 1.]]
np.ones((2,3)).dtype # 데이터타입은 float
dtype('float64')
print(np.eye(3)) # 3행 x 3열의 대각선을 1로 채우기
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
np.eye(3).dtype # 데이터타입은 float
dtype('float64')
print(np.diag([1,2,3])) # 3행 x 3열의 대각선을 리스트값으로 채우기
[[1 0 0]
[0 2 0]
[0 0 3]]
zeros, ones, eye 함수 모두 dtype이 float
np.empty
a = np.empty((3, 2)) # 3행 x 2열의 빈 매트릭스
b = np.empty((3, 2), dtype=int) # 3행 x 2열의 int 타입의 빈 매트릭스
print(a)
print(b)
[[1. 1.]
[1. 1.]
[1. 1.]]
[[ 0 1072693248]
[ 0 1072693248]
[ 0 1072693248]]
인덱싱, 슬라이싱
print(c)
[[[12 13 14 15]
[ 4 5 6 7]
[20 21 22 23]]
[[ 0 1 2 3]
[16 17 18 19]
[ 8 9 10 11]]]
print(c[0, 2, :]) # 첫번째 아이템의 3번째 행의 모든 열
[20 21 22 23]
[:end]
맨 처음부터 end 인덱스까지
print(c[1, 0, :-1]) # 두번째 아이템의 첫번째 행의 맨뒤 열 제외하고 모든열
[0 1 2]
print(c[1, 0, ::-1]) # 두번째 아이템의 첫번째 행의 뒤에서부터 거꾸로 모든 열
[3 2 1 0]
d = np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
print(d) # d는 6행 x 6열 2차원 매트릭스
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]
[50 51 52 53 54 55]]
d1 = d[0, 3:5] # 첫번째 행의 3~4번째
print(d1)
[3 4]
d2 = d[:, 2] # 모든 행의 3번째
print(d2)
[ 2 12 22 32 42 52]
::
인덱스 증가폭 2 (2칸 간격)
d3 = d[2::2, 0::2] # 세번째 행부터 2개 간격으로 ~ 첫번째 열부터 2개 간격으로
print(d3)
[[20 22 24]
[40 42 44]]
[start:]
start 인덱스에서 마지막까지
d4 = d[4:, 4:] # 다섯번째 행부터 끝까지, 다섯번째 열부터 끝까지
print(d4)
[[44 45]
[54 55]]
d4[:,:] = -d4[::-1, ::-1] # 슬라이싱 후 수정하면 원본 array에 영향을 준다
print(d4)
[[-55 -54]
[-45 -44]]
print(d)
[[ 0 1 2 3 4 5]
[ 10 11 12 13 14 15]
[ 20 21 22 23 24 25]
[ 30 31 32 33 34 35]
[ 40 41 42 43 -55 -54]
[ 50 51 52 53 -45 -44]]
d5 = d[4:, 4:].copy() # .copy()하여 슬라이싱 후 수정하면 원본에 영향 없다
d5[:, :] = -d5[::-1, ::-1]
print(d5)
print(d)
[[44 45]
[54 55]]
[[ 0 1 2 3 4 5]
[ 10 11 12 13 14 15]
[ 20 21 22 23 24 25]
[ 30 31 32 33 34 35]
[ 40 41 42 43 -55 -54]
[ 50 51 52 53 -45 -44]]
간접적 인덱싱
y = np.random.randint(0,20,10) # (0 ~ 20사이) 10개의 랜덤 integer
print(y)
[14 14 17 8 12 9 10 2 19 3]
index = np.array([2, 5, 8, 9]) # 인덱스를 array로 (3, 6, 9, 10번째)
print(y[index])
[17 9 19 3]
# d[i]가 7의 양의 배수일 때 d_7[i]가 True인 'd_7' array를 만들기
d_7 = (d > 0) & (d % 7 == 0) # d이 양수, 7로 나눈 나머지 == 0인 조건
연산
e = np.random.randint(-10, 10, size=(3, 2)) # (-10 ~ 10)까지 랜덤숫자를 3행x2열로
print(e)
[[ -2 -5]
[ 0 -3]
[-10 -6]]
max min sum mean std abs
print('np.max =', np.max(e), '; np.min =', np.min(e))
print('np.sum =', np.sum(e), '; np.mean =', np.mean(e))
print('np.std =', np.std(e))
np.max = 0 ; np.min = -10
np.sum = -26 ; np.mean = -4.333333333333333
np.std = 3.197221015541813
print('각 행의 max =', np.max(e, axis=1), '; 각 행의 min =', np.min(e, axis=1))
print('각 열의 max =', np.max(e, axis=0), '; 각 열의 min =', np.min(e, axis=0))
각 행의 max = [-2 0 -6] ; 각 행의 min = [ -5 -3 -10]
각 열의 max = [ 0 -3] ; 각 열의 min = [-10 -6]
print(np.abs(e)) # 절대값
[[ 2 5]
[ 0 3]
[10 6]]
f = np.random.randint(-8, 8, size=(3, 2)) # (-8 ~ 8)까지 랜덤숫자를 3행x2열로
print(f)
[[-8 5]
[-3 -1]
[-6 1]]
shape이 같은 array끼리 비교 연산
np.maximum
여러 array 비교 최대값 (np.max는 단일 array내 최대값)
g = np.maximum(e, f)
print(g)
[[-2 5]
[ 0 -1]
[-6 1]]
shape이 다른 arrays끼리 비교 연산
Broadcasting
e_means = np.mean(e, axis=1)
print(e_means)
[-3.5 -1.5 -8. ]
e - e_means # 두 array간 shape 문제로 연산 불가
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Input In [89], in <cell line: 1>()
----> 1 e - e_means
ValueError: operands could not be broadcast together with shapes (3,2) (3,)
e_means2 = np.reshape(e_means, (len(e_means), 1))
print(e_means2)
print(e_means2.shape) # 형태 변형
[[-3.5]
[-1.5]
[-8. ]]
(3, 1)
e - e_means2
array([[ 1.5, -1.5],
[ 1.5, -1.5],
[-2. , 2. ]])