Slicing - 잘라서 가져오기

import numpy as np
x = np.array([ 3,  6,  3,  5, 13,  9, 19])
X = np.array([[69, 10, 98, 68, 32],
               [14, 56, 73, 48, 69],
               [36, 48, 40, 28, 90],
               [45, 47, 65, 12, 95]])
               
x[1:4]
# array([6, 3, 5])

X[0:3,0:3]
# array([[69, 10, 98],
#        [14, 56, 73],
#        [36, 48, 40]])

boolean 연산

# 80보다 큰 데이터는 몇개입니까
(X > 80).sum()
# 3

# 80보다 큰 데이터를 가져오시요
X[X > 80]
#array([98, 90, 95])

Arithmetic operations and Broadcasting

2차원 배열 연산

import numpy as np
X = np.random.randint(1, 10 ,(2, 2))
Y = np.random.randint(100, 150, (2, 2))

X
# array([[7, 8],
#        [6, 3]])

Y
# array([[123, 103],
#        [131, 147]])

X + Y
# array([[112, 135],
#        [151, 130]])

X - Y
# array([[-104, -129],
#        [-147, -128]])
       
X * Y
# array([[432, 396],
#        [298, 129]])
    
X / Y
# array([[0.03703704, 0.02272727],
#        [0.01342282, 0.00775194]])

Accessing, Deleting, and Inserting Elements Into ndarrays

x = np.random.randint(1, 20, 7)
# array([ 3,  6,  3,  5, 13,  9, 19])

x[3]
# 5

x[-1]
# 19

다차원배열의 인덱스 접근

X = np.random.randint(0, 100, (5, 5))
# array([[39, 48, 91,  8,  8],
#        [12,  7, 70, 25, 69],
#        [54, 77, 71, 92, 73],
#        [12, 20, 39, 45, 53],
#        [ 1, 57, 95, 31, 87]])

X[0,2]
# 91

항목 삭제

x = np.array([ 3,  6,  3,  5, 13,  9, 19])
np.delete(x, 3)
# array([ 3,  6,  3, 13,  9, 19])

X = np.array([[69, 10, 98, 68, 32],
              [14, 56, 73, 48, 69],
              [36, 48, 40, 28, 90],
              [45, 47, 65, 12, 95]])

np.delete(X, 2, axis = 0)
# array([[69, 10, 98, 68, 32],
#        [14, 56, 73, 48, 69],
#        [45, 47, 65, 12, 95]])

np.delete(X, 1, axis = 1)
# array([[69, 98, 68, 32],
#        [14, 73, 48, 69],
#        [36, 40, 28, 90],
#        [45, 65, 12, 95]])

항목을 끝에 추가하기

a = np.arange(5)
a = a.reshape(1, 5)

np.append(X, a, axis = 0)
# array([[69, 10, 98, 68, 32],
#        [14, 56, 73, 48, 69],
#        [36, 48, 40, 28, 90],
#        [45, 47, 65, 12, 95],
#        [ 0,  1,  2,  3,  4]])

b = np.arange(4)
b = b.reshape(4, 1)

np.append(X, b, axis = 1)
# array([[69, 10, 98, 68, 32,  0],
#        [14, 56, 73, 48, 69,  1],
#        [36, 48, 40, 28, 90,  2],
#        [45, 47, 65, 12, 95,  3]])

항목을 원하는 위치에 추가하기

np.insert(X, 1, a, axis = 0)
# array([[69, 10, 98, 68, 32],
#        [ 0,  1,  2,  3,  4],
#        [14, 56, 73, 48, 69],
#        [36, 48, 40, 28, 90],
#        [45, 47, 65, 12, 95]])

np.insert(X, 1, b, axis=1)
# array([[69,  0, 10, 98, 68, 32],
#        [14,  1, 56, 73, 48, 69],
#        [36,  2, 48, 40, 28, 90],
#        [45,  3, 47, 65, 12, 95]])

데이터 전체에서 최댓값, 최솟값, 전체합, 전체평균, 표준편차을 구하세요

import numpy as np
X = np.random.randint(1, 100, (4,5))
# array([[73, 52, 45, 32, 40],
#        [22,  5,  8, 11, 56],
#        [58,  1, 95, 22, 36],
#        [ 1, 78, 47, 45, 63]])

X.max()
# 95

X.min()
# 91

X.sum()
# 790

X.mean()
# 39.5

X.std()
# 26.23451924468981

np.median(X)
# 42.5
# 행별로 최대값을 구하세요
X.max(axis = 1)
# array([73, 56, 95, 78])

# 열별로 sum 값을 구하세요
X.sum(axis = 0)
# array([154, 136, 195, 110, 195])

# X에 70보다 큰 데이터는 몇개가 있나요?
(X > 70).sum()
# 3

# X 의 데이터 중에서 70보다 큰 데이터만 가져오시오
X[X > 70]
# array([73, 95, 78])

특정 값으로, 행렬 만들기

# 6 으로 10개짜리 1차원 배열을 만드세요
np.full(10,6)
# array([6, 6, 6, 6, 6, 6, 6, 6, 6, 6])

# 6 으로 채워진 2행 3열짜리 행렬을 만드세요
np.full((2, 3), 6)
# array([[6, 6, 6],
#        [6, 6, 6]])

0과 1로 채우기

np.ones((3, 5))
# array([[1., 1., 1., 1., 1.],
#        [1., 1., 1., 1., 1.],
#        [1., 1., 1., 1., 1.]])
       
np.zeros((3,5))
# array([[0., 0., 0., 0., 0.],
#        [0., 0., 0., 0., 0.],
#        [0., 0., 0., 0., 0.]])

정수의 배열을 얻고자 할때

np.arange(9 + 1)
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# 3부터 20까지의 정수중 홀수만 만드세요
np.arange(3, 20 + 1, 2)
# array([ 3,  5,  7,  9, 11, 13, 15, 17, 19])

정수 말고 실수를 얻고자 할때

# 0부터 25까지의 실수 10개를 가져오세요
np.linspace(0, 25, 10)
# array([ 0.        ,  2.77777778,  5.55555556,  8.33333333, 11.11111111,
#        13.88888889, 16.66666667, 19.44444444, 22.22222222, 25.        ])
       
np.linspace(0, 25, 10, endpoint= False)
# array([ 0. ,  2.5,  5. ,  7.5, 10. , 12.5, 15. , 17.5, 20. , 22.5])

이렇게 1차원 배열을 얻은 후, 우리는 이것을 가지고 여러차원으로 만들 수 있다.

reshape

np.arange(5, 30).reshape((5, 5))

# array([[ 5,  6,  7,  8,  9],
#        [10, 11, 12, 13, 14],
#        [15, 16, 17, 18, 19],
#        [20, 21, 22, 23, 24],
#        [25, 26, 27, 28, 29]])

랜덤값으로 채워진 배열을 만들 수 있다.

# 넘파이에서는 랜덤으로 수를 채우는, 행렬을 제공한다.
np.random.random((3, 4))
# array([[0.58686352, 0.36179287, 0.34962168, 0.07714271],
#        [0.07544062, 0.09915818, 0.71302533, 0.71173274],
#        [0.93683057, 0.33314641, 0.82256852, 0.92437724]])

np.random.randint(start, stop, size = shape)

시작값과 끝값을 줄 수 있다.

np.random.randint(1, 6, (3, 4))
# array([[3, 4, 2, 5],
#        [4, 4, 2, 2],
#        [3, 4, 3, 4]])

정규분포를 만족하는 랜덤값으로 채우기

np.random.normal(mean, standard deviation, size=shape)

np.random.normal(170, 10, (2, 3))
# array([[160.82020044, 180.88250157, 172.82545527],
#        [172.63958709, 168.92942062, 177.29288586]])

 

NUMPY BASICS

  • NumPy는 다차원 배열을 처리할 수 있는 선형대수학(Linear Algebra) 라이브러리입니다.
  • 다음이 실행이 안되면 아나콘다프롬프트에서 conda install numpy 를 실행하여 설치합니다.

numpy

import numpy as np

a = [1, 2, 3, 4, 5]
np.array(a)
# array([1, 2, 3, 4, 5])
b = np.array(a)

b.mean()
# 3.0
b.size
# 5
b.shape
# (5,)
b.dtype
# dtype('int32')
b.max() 
# 5
b.min()
# 1
D = np.array([[1, 2], [3, 4]])
np.save('my_array', D)
Y = np.load('my_array.npy')
Y
# array([[1, 2],
#       [3, 4]])

날짜와 시간

# 날짜 관련
from datetime import date

# 파이썬이 처리할 수 있는 날짜 만들기
some_day = date(2022, 5, 8)

print(some_day.year, some_day.month, some_day.day, some_day.weekday())
# 2022 5 8 6

weekday

print(some_day.isoformat())
print(some_day.strftime('%Y/%m/%d'))
print(some_day.strftime('%y %m %d'))
print(some_day.strftime('%Y년 %m월 %d일'))
print(some_day.strftime('%Y/%m/%d %A'))

# 2022-05-08
# 2022/05/08
# 22 05 08
# 2022년 05월 08일
# 2022/05/08 Sunday

# 오늘 날짜 구하기
print(today)
print(today.isoformat())
print(today.weekday())

# 2022-04-27 12:28:00.019922
# 2022-04-27T12:28:00.019922
# 2

시각 다루기

from datetime import time
sometime = time(16, 33, 24)
print(sometime.hour, sometime.minute, sometime.second)

# 16 33 24

일시 다루기 - datetime

from datetime import datetime

datetime.today()
# datetime.datetime(2022, 4, 27, 11, 4, 48, 881345)

datetime.now()
# datetime.datetime(2022, 4, 27, 11, 5, 19, 761614)
import random

Random number : 난수 생성하기

0.0 ~ 1.0 사이 난수 생성

random.random()
# 0.9757008255286385

int 형의 난수를 얻는다.

random.randint(1, 6)
# 5

float 형의 난수를 얻는다.

random.uniform(1, 5)
# 4.8010407759256255

똑같은 난수의 패턴이 나오도록 하는 방법.

  • 테스트를 수행했을 경우, 다른사람도 같은 프로그램을 돌려서 같은값이 나오는지 확인하는 경우
  • 딥러닝에서 weight 초기값 할당하는 데 많이 사용됨
# 실행할 때마다 무작위로 데이터가 나오는데!!!
# 예를들어, 2, 5, 4, 2, 1, 6, 3 이런식으로 무작위로 나오되
# 무작위로 나온 수의 순서와 관련된 패턴을 똑같이 하고 싶을 때
# 씨드(seed) 값을 사용한다
random.seed(5)

정규분포에 해당하는 난수를 생성

random.normalvariate(170, 10) # 평균이 170, 표준편차가 10
# 154.87951225875938

리스트나 집합 등에 저장되어 있는 값들을, 랜덤으로 뽑는 함수

noodle_list = ['너구리', '신라면', '진라면', '왕뚜껑 ', '오징어짬뽕']
random.choice(noodle_list)

# '신라면'

요소들을 여러개 샘플로 뽑는 경우

random.sample(noodle_list, 3)

# ['너구리', '진라면', '신라면']

요소들을 막 섞어서 저장한다. (원본리스트 자체가 변함)

random.shuffle(noodle_list)
noodle_list

# ['진라면', '왕뚜껑 ', '신라면', '오징어짬뽕', '너구리']

원본 리스트는 변형없이 그대로 두고, 막 섞인 리스트를 얻어오고자 한다.

random.sample(noodle_list, len(noodle_list))

# ['왕뚜껑 ', '너구리', '진라면', '신라면', '오징어짬뽕']

LAMBDA EXPRESSIONS

  • Lambda function 은 anonymous function 이다. 즉 함수 이름이 없다.
  • Lambda functions 은 주로 filter(), map() , reduce() 함수와 함께 사용된다. 나중에~
  • 파라미터는 많아도 상관없지만, 연산은 딱 한줄이어야 한다.
pow_some1 = lambda x:x*2

def pow_some2(number):
    return number ** 2
    
pow_some1(3)
pow_some2(3)

# 9
# 9
def rest1(num1, num2):
    return num1 % num2
    
rest2 = lambda num1, num2:num1 % num2

rest1(11, 3)
rest2(11, 3)

# 2
# 2

FUNCTIONS

  • 함수란, 재사용 되는 코드 블럭 입니다.
  • Data or arguments 가 전달되고, 결과가 return 됩니다.
  • 우리가 프로그래밍 하다가, 반복되거나 재사용 되는 코드 블럭이 있으면, 이를 함수로 만들면 됩니다.
  • 남들이 이렇게 재사용 잘 되는 함수들을 미리 만들어 놓은 것들도 많습니다. 이를 라이브러리라고 합니다.

함수 문법

def fahr_to_kelvin(temp):
    result = (temp-32) * (5/9)+ 273.15
    return result
  
fahr_to_kelvin(100)
# 310.92777777777775

return 이 없는 경우

def my_function() :
    print('hello')
    print('bye')

my_function()
# hello
# bye

Parameter가 하나인 경우

def squared(number):
    result = number ** 2
    return result

squared(5)
# 25

Parameters 가 두개인 경우

def pow_times(number, count):
    result = number ** count
    return result

pow_times(2, 3)
# 8

Return 값이 둘 이상인 경우

def divide(num1, num2):
    return num1 // num2, num1 % num2
  
a,b = my_func(7, 3)
print(a, b)
# 2 1

Default parameter

def hello(age = 33):
    print("제 나이는 {}살 입니다.".format(age))
    
hello(24)
hello()

# 제 나이는 24살 입니다.
# 제 나이는 33살 입니다.

WHILE LOOPS

  • While loop 는, 조건식을 만족하는 동안, 자신이 포함하는 문장들을 실행한다
i = 0
while i < 7:
    print('hello')
    i++

# hello
# hello
# hello
# hello
# hello
# hello
# hello

Infinite Loop : 무한루프

  • 롯데리아에서 키오스크로 햄버거 주문할때, 유저가 버튼 누를때까지 화면은 계속 나오고 있다.
  • 게임이 시작되고 나면, 유저가 화장실을 갔다와도 게임은 계속 진행되고 있다.
# 유저한테 문장을 입력받는다.
# 유저가 입력한 문장을, 그대로 화면에 출력합니다.
# 단, 유저가 '그만' 이라는 문장을 입력하면,
# 프로그램을 멈춥니다.
# 그렇지 않을 경우는, 계속해서 유저한테 문장을 입력받습니다.

while True:
    sentence = input("문장을 입력하세요:")
    if sentence == '그만':
        break
    print(sentence)

+ Recent posts