오늘은 NumPy의 마지막 수업이었다. 처음에는 행렬이라는 낯선 개념에 다양한 기능들까지 배우느라 따라가는 것만으로도 버거웠는데, 이제는 행렬과 NumPy에 꽤 익숙해진 것 같다. 특히 어려웠던 axis 개념도 이제는 충분히 이해하고 활용할 수 있을 것 같다.
물론 NumPy의 기능이 워낙 다양해서 문제를 풀 때마다 필요한 함수를 찾아보고 있지만, 계속 사용하다 보면 자주 쓰는 것들은 자연스럽게 익숙해질 것 같다.
np.dot( ), np.matmul( ) → 행렬의 곱셈의 경우 np.matmul( ) 사용을 권장np.dot(a, b)a = np.array(3)
b = np.array(4)
print(np.dot(a, b)) # 12
a = np.array([1,2,3])
b = np.array([4,5,6])
print(np.dot(a, b)) # 32
a = np.array([[1,2,3], [4,5,6]])
b = np.array([[1,2], [3,4], [5,6]])
print(np.dot(a, b))
# [[22 28]
# [49 64]]
np.matmul(a, b)a = np.array(3)
b = np.array(4)
print(np.matmul(a, b))
# ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
a = np.array([1,2])
b = np.array([3,4])
print(np.matmul(a, b)) # 11
a = np.array([[1,2,3], [4,5,6]])
b = np.array([[1,2], [3,4], [5,6]])
print(np.matmul(a, b))
# [[22 28]
# [49 64]]
c = np.array([[1,2], [3,4]])
d = np.array([5,6])
print(np.matmul(c, d))
# [17 39]
print(np.matmul(d, c))
# [23 34]
np.matmul( ) 연산은 @ 연산자로 사용 가능e = np.array([[1,2,3]])
f = np.array([[1,2], [3,4], [5,6]])
print(np.matmul(e, f))
# [[22 28]]
print(e @ f)
# [[22 28]]
array.ravel()a = np.array([[1,2,3], [4,5,6]])
print(a)
# [[1 2 3]
# [4 5 6]]
flat = a.ravel()
print(flat)
# [1 2 3 4 5 6]
flat[2] = 100
print(flat)
# [ 1 2 100 4 5 6]
print(a)
# [[ 1 2 100]
# [ 4 5 6]]
array.flatten()a = np.array([[1,2], [3,4], [5,6], [7,8]])
print(a)
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
flat = a.flatten()
print(flat)
# [1 2 3 4 5 6 7 8]
flat[4] = 0
print(flat)
# [1 2 3 4 0 6 7 8]
print(a)
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
np.expand_dims(a, axis)a0 = np.expand_dims(a, axis=0)
print(a0.shape)
# (1, 2, 3)
print(a0)
# [[[1 2 3]
# [4 5 6]]]
a1 = np.expand_dims(a, axis=1)
print(a1.shape)
# (2, 1, 3)
print(a1)
# [[[1 2 3]]
#
# [[4 5 6]]]
a2 = np.expand_dims(a, axis=2)
print(a2.shape)
# (2, 3, 1)
print(a2)
# [[[1]
# [2]
# [3]]
#
# [[4]
# [5]
# [6]]]
np.squeeze(a, axis)a = np.array([[[[1], [2], [3]]]])
print(a.shape)
# (1, 1, 3, 1)
s = np.squeeze(a)
print(s)
# [1 2 3]
print(s.shape)
# (3,)
a2 = np.zeros((1,4,1,2))
print(a2.shape)
# (1, 4, 1, 2)
s1 = np.squeeze(a2, axis=0)
print(s1.shape)
# (4, 1, 2)
s2 = np.squeeze(a2, axis=2)
print(s2.shape)
# (1, 4, 2)
s3 = np.squeeze(a2, axis=1)
# ValueError: cannot select an axis to squeeze out which has size not equal to one
np.unique()a = np.array([1,1,2,2,6,2,2,3,3,3,4,4,5])
u1 = np.unique(a)
print(u1)
# [1 2 3 4 5 6]
u2, idx, inv, cnt = np.unique(a, return_index=True, return_inverse=True, return_counts=True)
print("인덱스 :", idx) # 고유값이 원본에서 처음 나타나는 인덱스
# 인덱스 : [ 0 2 7 10 12 4]
print("원본의 고유값 인덱스 :", inv)
# 원본의 고유값 인덱스 : [0 0 1 1 5 1 1 2 2 2 3 3 4]
print("값의 등장 횟수 :", cnt)
# 값의 등장 횟수 : [2 4 3 2 1 1]
np.concatenate()a = np.array([[1,2], [3,4]]) # (2, 2)
b = np.array([[5,6]])
result = np.concatenate((a, b))
print(result)
# [[1 2]
# [3 4]
# [5 6]]
print(result.shape)
# (3, 2)
c = np.array([[7], [8], [9]])
result2 = np.concatenate((result, c), axis=1)
print(result2)
# [[1 2 7]
# [3 4 8]
# [5 6 9]]
print(result2.shape)
# (3, 3)
result0 = np.concatenate((a, b), axis=1)
# ValueError
np.stack()a = np.array([1,2,3]) # (3,)
b = np.array([4,5,6])
# axis=0
s1 = np.stack((a,b))
print(s1)
# [[1 2 3]
# [4 5 6]]
print(s1.shape)
# (2, 3)
# axis=1
s2 = np.stack((a,b), axis=1)
print(s2)
# [[1 4]
# [2 5]
# [3 6]]
print(s2.shape)
# (3, 2)
np.hstack() : 배열을 열 방향으로 순서대로 쌓음a = np.array([1,2,3])
b = np.array([4,5,6])
h = np.hstack((a, b))
print(h)
# [1 2 3 4 5 6]
np.vstack() : 배열을 행 방향으로 순서대로 쌓음a2 = np.array([[1], [2], [3]])
b2 = np.array([[4], [5], [6]])
v = np.vstack((a2, b2))
print(s)
# [[1]
# [2]
# [3]
# [4]
# [5]
# [6]]
np.split()a = np.arange(9)
s = np.split(a, 3)
print(a)
# [0 1 2 3 4 5 6 7 8]
print(s)
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
print(s[0])
# [0 1 2]
print(s[1])
# [3 4 5]
print(s[2])
# [6 7 8]
a = np.arange(9)
s = np.split(a, 4)
# ValueError: array split does not result in an equal division
a = np.arange(16).reshape(4,4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]
# [12 13 14 15]]
s1 = np.split(a, [1,3])
for part in s1:
print(part)
# [[0 1 2 3]]
# [[ 4 5 6 7]
# [ 8 9 10 11]]
# [[12 13 14 15]]
s2 = np.split(a, 2, axis=1)
for part in s2:
print(part)
# [[ 0 1]
# [ 4 5]
# [ 8 9]
# [12 13]]
# [[ 2 3]
# [ 6 7]
# [10 11]
# [14 15]]
np.sort(array), array.sort()np.sort(array)array.sort()a = np.array([3,1,4,2])
s = np.sort(a)
print(s)
print(a)
# [1 2 3 4]
# [3 1 4 2]
a.sort()
print(a)
# [1 2 3 4]
print(a[::-1])
# [4 3 2 1]
a = [[6,5,4], [3,1,2]]
s1 = np.sort(a, axis=0)
print(s1)
# [[3 1 2]
# [6 5 4]]
s2 = np.sort(a, axis=1)
print(s2)
# [[4 5 6]
# [1 2 3]]
np.argsort()a = np.array([3,1,4,2])
idx = np.argsort(a)
print(idx)
# [1 3 0 2]
print(a[idx])
# [1 2 3 4]
앞으로를 생각해보면 지금이 가장 중요한 시기인 것 같다. 프로젝트가 시작되고 바빠지면 기초 공부는 뒷전이 되기 쉬운데, 그렇게 되기 전에 지금부터 탄탄하게 기초를 다져놓아야 한다고 생각한다.하지만 막상 실천하려니 체력과 시간이 부족해서 현재 공부하고 있는 것들조차 충분히 못하고 있는 것 같아 아쉽다. 내일부터는 Pandas 공부가 시작된다고 하니, 지금이라도 할 수 있는 만큼 최대한 기초를 단단히 해놓아야겠다