import numpy as np def python_basie(): a = np.array([[1, 2, 3], [3, 4, 5]]) print(a[1]) a, b = 3, 5 c = 3, 5 # packing print(a, b, c) d, e = c # unpacking print(d, e) def f(a, b, c): print(a, b, c) f(1,2, 3) # positional f(a=3, b=2, c=1) # keyword # [] : List : 중간중간 쉼표가 있음. # [] : numpy.ndarray : 중간중간 쉼표가 없음. # slicing. List와 ndarray 둘다 동작 def slicing(): a = range(10) print(a) a = list(a) print(a) print(a[0]) print(a[0:3]) # range()와 동일 print(a[-1]) print(a[3:]) print(a[0:int(len(a) / 2)]) print(a[int(len(a) / 2):]) print(a[0:5]) print(a[5:]) print(a[:5]) print(a[5:]) print(a[:]) # 전체 print(a[::2]) # 짝수 번째 print(a[1::2]) # 홀수 번째 print(a[-1::-1]) print(a[::-1]) def np_basic(): a = np.arange(6) print(a) print(a.shape, a.dtype, a.size, a.ndim) b = np.reshape(a, [2,3]) print(b) b = a.reshape([2,3]) # OK print(b) b = a.reshape((2,3)) # OK print(b) b = a.reshape(2,3) # OK python에서 튜플의 ()의 괄호는 생략 가능 print(b) # broadcast 연산 print(a+1) print(a*2) print(a/2) print(a>2) print(a ** 2) print(a[a>2]) # a> 2 항목만 뽑아 줌 print(np.sin(a)) # universal function print(b+1) print(b*2) print(b/2) print(b>2) print(b ** 2) print(b[b>2]) # a> 2 항목만 뽑아 줌 print(np.sin(b)) # universal function print(a+a) # vector operation print(b+b) a1 = np.arange(3) a2 = np.arange(6) a3 = np.arange(3).reshape(1,3) a4 = np.arange(3).reshape(3,1) a5 = np.arange(6).reshape(2,3) print("-"*50) print("a2", a2) print("a3", a3) print("a4", a4) print("a5", a5) print("-"*50) # scaler + vector ok : broadcast # shape이 다른 vector끼리는 NG ! # 같은 shape 끼리는 연산 가능 OK ! : vector op # 1개 짜리 vector는 scale로 간주함. : broadcast # a1+a2 # ng : shape이 다르면 error print(a1+a3) # ok : vector op print(a1+a4) # ok : broadcast + broadcast print(a1+a5) # ok : broadcast + vector op #print(a2+a3) #print(a2+a4) #print(a2+a5) # print(a3+a4) # print(a3+a5) # #print(a4+a5) c = np.arange(12) #아래 3가지는 모두 동일 print(c.reshape(3,4).shape) print(c.reshape(-1,4).shape) print(c.reshape(3,-1).shape) d = c.reshape(3,4) # 아래 2가지는 모두 동일 print(d.reshape(12)) print(d.reshape(-1)) np.random.seed(1) e = np.random.randint(100, size=12).reshape(3,4) print(e) print(np.max(e)) print("axis=0", np.max(e, axis=0)) # 수직 print("axis=1", np.max(e, axis=1)) # 수평 print(np.argmax(e)) print("axis=0", np.argmax(e, axis=0)) # 수직에서 가장 큰 위치 알려 줌 print("axis=1", np.argmax(e, axis=1)) # 수평에서 가장 큰 위치 알려 줌
import numpy as np import tensorflow as tf a = np.arange(10) print(a) # 여러 항목을 한번에 꺼내는 방법 print(a[3], a[9]) # 는 아래와 동일하다. numpy는 "Index 배열" 지원 함. print(a[[3, 9]]) # []를 하나더 해줘야 한다. 배열 행/열 index와 충돌 피하기 위해. print("-"*50) b = np.arange(12).reshape(3,4) print(b) print(b[0]) print(b[[0, -1]]) # 2개의 행데이터를 뽑아서 결합하는 방법. Index 배열 사용 print(b[::-1]) # 행 순서 뒤집기 print(b[-1, -1]) # 마지막 데이터. # "Fancy index"이라 부름. 대괄호 안에 ,를 사용하는 문법. 차원마다 ,가 늘어남. # 정수, slicing, print(b[::-1, ::-1]) # 행과 열을 모두 뒤집기. print(b.T) # transpose # 문제 : 2차원 배열을 전치 형태로 출력하세요 (반복문, fancy index 사용) for i in range(b.shape[-1]): print(b[:, i]) # 행을 가져오는 것도 사실은 열 인덱싱을 생략한 것. for i in range(b.shape[0]): print(b[i, :]) def show_matmul(s1, s2): a = tf.constant(s1, shape=s1) b = tf.constant(s2, shape=s2) result = tf.matmul(a, b).shape print(" {} @ {} = {} ".format(s1, s2, result)) show_matmul([2,3], [3,2]) # 데이터가 아니라 shape을 넘긴 것임. show_matmul([3,4], [4,2]) show_matmul([7, 2, 3], [7, 3, 2]) # tensorflow의 행렬 2차원까지밖에 없음. # 앞의 7은 7번 2차원행렬 연산을 할거란 의미. 2, 3과 3, 2는 매칭되어야 함. show_matmul([2, 7, 3], [2, 3, 2]) # np squeeze : 의미 없는 차원을 없애 줌. 1차원만 없앨 수 있음. 2차원은 못 없앰. x = np.array([[[[[0], [1], [2]], [[3], [4], [5]]]]]) print(x) print(x.shape) print(x.squeeze(axis=0).shape) print(x.squeeze(axis=1).shape) print(x.squeeze(axis=4).shape) print(x.squeeze().shape) # 모두 한꺼번에 제거 np.random.seed(123) t = np.random.random_integers(0, 100, 24).reshape(2, 3, 4) # 0~100에서 24개 생성 print("\n") print(t) print("\n") print(np.argmax(t, axis=0), end='\n\n') # 0차원 2개 끼리 비교 print(np.argmax(t, axis=1), end='\n\n') # 1차원 3개 끼리 비교 print(np.argmax(t, axis=2), end='\n\n') # 2차원 4개 끼리 비교
댓글 없음:
댓글 쓰기