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개 끼리 비교
댓글 없음:
댓글 쓰기