(5주차) 4월6일
numpy (선언, 브로드캐스팅, 수학연산, 인덱싱, reshape, 랜덤으로 생성, 행렬관련기능)
-
(1/5) 넘파이공부 1단계: 선언, 기본연산 브로드캐스팅, 기타수학연산지원
-
(2/5) 넘파이공부 2단계: 인덱싱1차원, 인덱싱2차원
-
(3/5) 넘파이공부 2단계: 1차원 배열의 선언
-
(4/5) 넘파이공부 2단계: reshape
-
(5/5) 넘파이공부 2단계: 2차원 배열의 선언, 랜덤으로 배열 생성, 행렬관련기능
import numpy as np
a=np.array([1,2,3]) # list를 만들고 ndarray화 시킴
l=[1,2,3]
a+1 ## [1,2,3] + 1 = [2,3,4]
l+1
a*2
l*2
a/2
l/2
a**2
l**2
a%2 # %2 = 2로 나눈 나머지를 리턴 a=[1,2,3]
l%2
np.sqrt(a), np.sqrt(l)
np.log(a), np.log(l)
np.exp(a), np.exp(l)
np.sin(a), np.sin(l)
-
선언
l=[11,22,33,44,55,66]
a=np.array(l)
-
인덱스로 접근
l[0],l[1],l[2],l[3],l[-2],l[-1]
a[0],a[1],a[2],a[3],a[-2],a[-1]
-
:
이용 (슬라이싱)
l[2:4] # index 2에서 시작, index 4는 포함하지 않음
a[2:4]
-
정수배열에 의한 인덱싱
a
a[[0,2,4]] # index=0, index=2, index=4 에 해당하는 원소를 뽑고 싶다
l[[0,2,4]] # 리스트는 불가능
-
부울값에 의한 인덱싱
a
a[[True,False,True,False,True,False]]
응용하면?
a < 33
a[a<33]
리스트는 불가능
l<33 # 여기에서부터 불가능
l[[True,False,True,False,True,False]] # 이것도 불가능
-
중첩리스트와 2차원 np.array 선언
A = [[1,2,3,4],[-1,-2,-3,-4],[5,6,7,8],[-5,-6,-7,-8]]
A2 = np.array(A)
A2
A
-
A의 원소 인덱싱
A[0][0] # (1,1)의 원소
A[1][2] # (2,3)의 원소
A[-1][0] # (4,1)의 원소
-
A2의 원소 인덱싱
A2[0][0] # (1,1)의 원소
A2[1][2] # (2,3)의 원소
A2[-1][0] # (4,1)의 원소
-
A2에서만 되는 기술 (넘파이에서 제시하는 신기술, R에서는 기본적으로 쓰던것, 이중list는 불가능)
A2[0,0] # (1,1)의 원소
A2[1,2] # (2,3)의 원소
A2[-1,0] # (4,1)의 원소
-
정수배열에 의한 인덱싱 & 슬라이싱!
A2
A2[0,0:2] # 1행1열, 1행2열
A2[0,:] # 1행
A2[0] # 1행
A2[[0,2],:] # 1행, 3행
A2[[0,2]] # 1행, 3행
A2[:,0] # 1열
A2[:,[0]] # 1열
A2[:,[0,2]] # 1열, 3열
A2[0:2,[0,2]] # 1행~2행 // 1열,3열
-
리스트나 튜플을 선언하고 형변환
np.array((1,2,3)) # 튜플->넘파이어레이
np.array([1,2,3]) # 리스트 ->넘파이어레이
-
range()를 이용해서 선언하고 형변환
np.array(range(10)) # range(10) -> 넘파이어레이
-
np.zeros, np.ones
np.zeros(3)
np.ones(4)
-
np.linspace
np.linspace(0,1,12) # 0에서 시작하고 1에서 끝남 (양끝점 모두 포함)
len(np.linspace(0,1,12)) # 길이는 12
-
np.arange
np.arange(5) # np.array(range(5))
np.arange(1,6) # np.array(range(1,6))
-
reshape: ndarray의 특수한 기능
a=np.array([11,22,33,44,55,66])
a ## 길이가 6인 벡터
a.reshape(2,3) ## (2,3) matrix 라고 생각해도 무방
note: reshape은 a자체를 변화시키는것은 아님
a # a는 그대로 있음
b= a.reshape(2,3) # a를 reshape한 결과를 b에 저장
b
a # a는 여전히 그대로 있음
-
다시 b를 a처럼 바꾸고 싶다
b
b.reshape(6) # b는 (2,3) matrix , 그런데 이것을 길이가 6인 벡터로 만들고 싶다.
-
reshape with -1
a=np.arange(24) # np.array(range(24))
a
a.reshape(2,-1)
a.reshape(3,-1)
a.reshape(4,-1)
a.reshape(5,-1)
a.reshape(6,-1)
a.reshape(7,-1)
a.reshape(8,-1)
a.reshape(12,-1)
b= a.reshape(12,-1)
b
b.reshape(-1) # b를 다시 길이가 24인 벡터로!
np.zeros((3,3))
np.ones((3,3))
np.eye(3)
np.diag([1,2,3,-1])
np.random.randn(10) # 표쥰정규분포에서 10개를 뽑음
np.random.rand(10) # 0~1사이에서 10개를 뽑음
np.random.randn(4).reshape(2,2) # 표준정규분포에서 4개를 뽑고 (2,2) ndarray로 형태변환
np.random.rand(4).reshape(2,2) # 0~1 4개를 뽑고 (2,2) ndarray로 형태변환
A=np.arange(4).reshape(2,2)
A
A.T # .T는 전치행렬을 구해줌
np.linalg.inv(A) # np.linalg.inv는 역행렬을 구해주는 함수
A @ np.linalg.inv(A) # @는 행렬곱을 수행
A=np.array(range(6))
A # 길이가 6인 벡터
위와 같이 길이가 6인 벡터 A를 (2,3) ndarray로 변경 (reshape를 이용)
-
행렬을 알고 있다면 위의 주소의 영상은 skip 하셔도 무방합니다.