2018년 10월 15일 월요일

numpy

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개 끼리 비교 

댓글 없음:

댓글 쓰기