arr_2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
### shape 2가지
arr_2d.shape # (3,3)
np.shape(arr_2d) # (3,3)
## reshape
arr_2d.reshape((1,9)) # reshape은 m,n을 가진 튜플 인자 하나
arr_2d.rehape((-1,1)) # -1값은 남은 차원으로부터 추정해서 알아서 들어감 -> (9,1)
a = np.arange(2*3*5).reshape((2,3,5)) # 간단히 행렬만들 때 Tip
x = np.array([1,2,3])
c = 5
#x+c : [6 7 8]
#x-c : [-4 -3 -2]
#x*c : [ 5 10 15]
#x/c : [0.2 0.4 0.6]
y = np.array([1,3,5])
z = np.array([2,9,20])
#y+z : [ 3 12 25]
#y-c : [ -1 -6 -15]
#y*c : [ 2 27 100]
#y/c: [0.5 0.33333333 0.25 ]
ex)
w = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
w[0,0] # 1
w[2,3] # 12
w[2,-1] # 12
기본적으로 같은 Type의 data에 대해서만 연산이 적용 가능
But 만약 피연산자가 연산 가능하도록 변환이 가능하다면 서로 다른 차원의 연산이 가능합니다.
이를 Broadcasting이라고 합니다.
#1
x = x[:,None] # 행벡터 -> 열벡터로 전치, 슬라이스로 1차원배열을 2차원으로
#2
x = x.reshape((-1,1))
,도 동일하다.
np.zeros((3,3))
np.ones((3,3))
np.diag((1,2,3))
np.eye(n, dtype=int,uint,float,complex,...))
np.dot(a,b)
or a @ b
을 사용
dot
vs matmul
참고 블로그
https://bit.ly/3epl8xg
np.trace()
을 사용
temp = np.arange(4*3).reshape((4,3))
print(temp)
print(temp.trace())
#[[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
# -> 12
np.linalg.det()
으로 계산
행렬식의 기하학적의미 참고 유튜브
https://www.youtube.com/watch?v=2bv_7QzBS4Y
https://www.youtube.com/watch?v=odULaDE65AI
np.linalg.det(arr_3) # 0의 의미는 singular하다. -> 역행렬이 없다.
np.linalg.inv()
를 사용
mat_2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
mat_2
#np.linalg.inv(mat_2) -> Error
# 역행렬이 존재하지 않을 경우 inv는 에러
np.linalg.eig()
로 계산
mat = np.array([[2,0,-2],[1,1,-2],[0,0,1]])
#array([[ 2, 0, -2],
# [ 1, 1, -2],
# [ 0, 0, 1]])
np.linalg.eig(mat) # 고유값, 고유벡터를 반환하는데 고유값 인덱스 수능로 고유벡터는 column 기준
#(array([1., 2., 1.]),
# array([[0. , 0.70710678, 0.89442719],
# [1. , 0.70710678, 0. ],
# [0. , 0. , 0.4472136 ]]))