0. imports

아래코드를 이용하여 numpy 와 matplotlib을 import하라.

import numpy as np
import matplotlib.pyplot as plt

1. 코드구현 I (40점)

주의: 문제에 조건이 있는 경우 조건을 준수할 것

(1) a의 type을 bool로 바꾸어라.

a=1.0

(2)-(6)

아래의 문자열을 고려하자.

test_arr = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSUGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q== schacon@mylaptop.local'

(2) 위 문자열에서 짝수번째 원소를 출력하는 코드를 작성하라.

(3) 위 문자열에서 마지막 10개의 원소를 출력하는 코드를 작성하라.

(4) 위 문자열을 뒤집은 문자열을 구하는 코드를 작성하라. 즉 아래를 출력하는 코드를 작성하라.

'lacol.potpalym@nocahcs ==Q7M+frw9iFRrNxbsSVqMlTarQ10d1os2njkImtaKn1+3r3wg+b8li/Z68Ec2DryauLMVmPZ98IPTnPZO4WA+ZmnE/trewr0bP/wv6ybNYjvDNpyX88XrrpKJQjlFUuz1bmFIe/86wW0V3+5x9Q1McnsAoJoaF3tAX7/KVlSvFMdsdwQANsjR6V8qLicMsZAHpXhKn1XixqBtiRXF3oAH+RCFXWlByTM/JdOk7vbP3adc0gwSppPbkVQ5XFl9h4fVELElx7MzQivrFUhbj9WJ4HJ81we5Zy4Idh7WYTDHlzfan+lPGUSDWB/mojT9KGTLNpITmrbS71YHfrHDkpUOlkAEQAAAwIBAAAAE2cy1CazN3BAAAA asr-hss'

(5) 위 문자열에서 대문자의 수를 count하라.

hint .isupper() 메소드를 이용할 것.

'a'.isupper()
False
'A'.isupper()
True
'='.isupper()
False
'@'.isupper()
False

(6) 위 문자열에서 사용된 문자 및 특수문자의 종류는 모두 몇가지 인가?

note1: 문자열 'AAB @ab' 에서 사용된 문자는 'A', 'B', ' ', '@', 'a', 'b' 이므로 모두 6종류의 문자 및 특수문자가 사용되었다.

note2: ' ', '+', '-', '.', '/', '=', '@', '1', 'a', 'A' 등을 모두 다른 문자로 취급한다.


(7) 리스트컴프리헨션을 이용하여 아래와 같은 리스트를 생성하라

['a',
 'aa',
 'aaa',
 'aaaa',
 'aaaaa',
 'aaaaaa',
 'aaaaaaa',
 'aaaaaaaa',
 'aaaaaaaaa',
 'aaaaaaaaaa'] <- a가 10개있음

(8) 길이가 1인 튜플을 만들어 자신의 학번을 저장하라. 길이가 1인 튜플을 만들어 자신의 영문이름을 저장하라. 두 튜플을 + 연산자로 합쳐아래와 같은 출력결과를 얻어라.

(202143052,'guebin')

(9) 아래와 같은 list가 있다고 하자.

test_lst = [['g',1],['u',5],['e',2],['b',8],['i',2],['n',9]]

test_lst와 리스트컴프리헨션을 이용하여 아래를 출력하는 코드를 구현하라.

['g', 'uuuuu', 'ee', 'bbbbbbbb', 'ii', 'nnnnnnnnn']

(10) 다음은 학생들의 출석,레포트,중간고사,기말고사 점수를 입력으로 하여 학점을 계산하는 함수이다.

def grade(attendance, report, mid, final): 
    if attendance<70: 
        credit = 'F' 
    else: 
        total_score = attendance * 0.1 + report * 0.2 + mid * 0.3 + final * 0.4 
        if total_score > 80: 
            credit = 'A+' 
        else:
            credit = 'B0' 
    return credit

아래는 학생들의 학번, 출석점수, 레포트, 중간고사, 기말고사 점수가 입력된 리스트이다.

data = [['202212345', [100,95,25,90]],
        ['202212346', [60,90,95,95]],
        ['202212347', [50,90,45,35]],
        ['202212348', [90,90,50,75]],
        ['202212349', [100,95,85,85]],
        ['202212350', [90,90,100,95]],
        ['202212351', [100,95,100,95]],
        ['202212352', [95,85,80,60]],
        ['202212353', [100,90,60,55]],
        ['202212354', [100,85,70,95]],
        ['202212355', [100,95,40,100]]]

아래의 ???를 적절하게 완성하여 학생들의 학점을 계산하는 코드를 완성하라.

[grade(???) for _, scores in data]

(11) 길이가 0인 문자열을 선언하라.


(12)-(15)

(12) dir(plt)와 dir(np)를 각각 실행하라. 실행결과를 각각 a,b로 저장하라. a,b의 type은 무엇인가?

(13) a의 원소와 b의 원소의 수를 각각 구하라.

(14) a와 b의 공통원소의 수를 구하라.

(15) a와 b의 원소를 합친 리스트를 만들어라. (공통원소는 중복하여 합치지 않는다)


(16)-(18) 아래와 같은 dictionary가 있다.

test_dic = {'202212345': {'att':100,'rep':95,'mid':25,'fin':90},
            '202212346': {'att':60,'rep':90,'mid':95,'fin':95},
            '202212347': {'att':50,'rep':90,'mid':45,'fin':35},
            '202212348': {'att':90,'rep':90,'mid':50,'fin':75},
            '202212349': {'att':100,'rep':95,'mid':85,'fin':85},
            '202212350': {'att':90,'rep':90,'mid':100,'fin':95},
            '202212351': {'att':100,'rep':95,'mid':100,'fin':95},
            '202212352': {'att':95,'rep':85,'mid':80,'fin':60},
            '202212353': {'att':100,'rep':90,'mid':60,'fin':55},
            '202212354': {'att':100,'rep':85,'mid':70,'fin':95},
            '202212355': {'att':100,'rep':95,'mid':40,'fin':100}}

여기에서 202212345등은 학번을, att는 출석점수, rep는 레포트점수, mid는 중간고사점수, fin은 기말고사 점수를 의미한다.

(16) get 메소드를 이용하여 202212353에 해당하는 학생의 성적을 아래와 같이 리턴하라.

{'att': 100, 'rep': 90, 'mid': 60, 'fin': 55}

(17) 202212354의 레포트 점수를 리턴하라.

(18) 학생들의 학번을 리턴하는 코드를 작성하라.


(19) shape이 ()인 numpy이 array를 만들어라. (즉 차원이 0인 np.array를 만들어라)

(20) shape이 (2,2)인 단위행렬을 만들어라.

(21) a의 모든 원소에 1을 더하는 코드를 작성하라.

a=[1,3,2,5,-3,3,8,2,3,1]

(22) 아래와 같은 수열을 생성하라.

1,3,6,10,15,21,28,36,45, ... , 378, 406, 435

hint: 이 수열에서 $a_n-a_{n-1}=n, ~n\geq 2$ 이다. 즉 3-1=2, 6-3=3, 10-6=4, ...

(23) 아래와 같은 수열을 생생성하라.

0,1,2,3,4,5,...,99

위의 수열에서 1,4,7,10,13,... 번째의 원소를 뽑아라. (첫번째 원소는 0이다)

(24) numpy를 이용하여 아래의 역행렬을 구하라. $$\begin{bmatrix} 1& 0 \\ 0& 3 \end{bmatrix}$$


(25)-(30)

a,b가 아래와 같이 주어졌다고 하자.

a=[1]*10 
b=[2]*10

(25) a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.

array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

(26) a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.

array([[1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [1],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2],
       [2]])

(27) a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.

array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]]

(28) a,b와 np.concatenate를 이용하여 아래와 같은 배열을 만들어라.

array([[1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2]])

(29) a,b와 np.stack을 이용하여 아래와 같은 배열을 만들어라.

array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]]

(30) a,b와 np.stack을 이용하여 아래와 같은 배열을 만들어라.

array([[1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2],
       [1, 2]])

(31) 아래와 같은 배열이 있다고 하자.

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

numpy의 @ 연산자를 이용하여 $\sum_{i=1}^{5}a_ib_i$를 계산하라.

(32) 아래와 같은 배열을 생성하라.

x=np.random.randn(100)

numpy의 @연산자를 이용하여 $\sum_{i=1}^{100}x_i^2$을 계산하라.

(33) 아래와 같은 배열을 생성하라.

a=np.array([1/100]*100)
x=np.random.randn(100)

numpy의 @연산자를 이용하여 $\frac{1}{n}\sum_{i=1}^{n}x_i$를 계산하라.

(34) 표준정규분포에서 100개의 난수를 생성하라.

(35) 아래와 동일한 코드를 np.random.rand()로 구현하라.

np.random.uniform(low=2,high=4,size=(5,))

(36) 아래와 같은 배열을 선언하라.

a=np.random.randn(100)

np.where를 이용하여 a의 모든 음수를 0으로 바꾸는 코드를 작성하라.

(37) 아래와 같은 배열을 선언하라.

a=np.random.randn(100)

위 배열의 최소값이 위치한 index를 return하라.

(38) 아래와 같은 배열을 선언하라.

a=np.arange(12).reshape(3,4)
a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

차원의 수를 유지하면서 1열을 추출하는 코드를 작성하라. 즉 결과가 아래와 같이 나오도록 하라.

array([[0],
       [4],
       [8]])

(39)-(40)

(39) 자신의 학번으로 random seed 를 설정하라. [20,25)의 범위에서 100개의 정수를 랜덤으로 생성해 (10,10) shape의 배열을 만들어라.

(40) 39의 결과에서 20,21,22 는 각각 몇개씩 있는가?

2. 코드구현 II (50점)


(1)-(6) 아래의 코드를 실해하여 test_dic를 생성하라.

np.random.seed(43052)
att = np.random.choice(np.arange(10,21)*5,200)
rep = np.random.choice(np.arange(5,21)*5,200)
mid = np.random.choice(np.arange(0,21)*5,200)
fin = np.random.choice(np.arange(0,21)*5,200)
key = ['202212'+str(s) for s in np.random.choice(np.arange(300,501),200,replace=False)]
test_dic = {key[i] : {'att':att[i], 'rep':rep[i], 'mid':mid[i], 'fin':fin[i]} for i in range(200)}
del(att);del(rep);del(mid);del(fin);del(key)

여기에서 202212345등은 학번을, att는 출석점수, rep는 레포트점수, mid는 중간고사점수, fin은 기말고사 점수를 의미한다.

(1) test_dic에서 출석점수가 70이상(70>=)인 학생들의 학번을 출력하는 코드를 작성하라.

np.random.seed(43052)
att = np.random.choice(np.arange(10,21)*5,200)
rep = np.random.choice(np.arange(5,21)*5,200)
mid = np.random.choice(np.arange(0,21)*5,200)
fin = np.random.choice(np.arange(0,21)*5,200)
key = ['202212'+str(s) for s in np.random.choice(np.arange(300,501),200,replace=False)]
test_dic = {key[i] : {'att':att[i], 'rep':rep[i], 'mid':mid[i], 'fin':fin[i]} for i in range(200)}
del(att);del(rep);del(mid);del(fin);del(key)

(2) test_dic에서 출석점수가 70미만(<70)인 학생들의 수를 구하라.

(3) test_dic에서 출석점수가 70이상(70>=)인 학생들의 중간고사 점수의 평균을 계산하라.

np.mean([test_dic[k]['mid'] for k in test_dic if test_dic[k]['mid']>=70])
85.41666666666667

(4) test_dic에서 중간고사 점수를 출력하는 코드를 작성하라.

(5) test_dic에서 중간고사 점수의 표준편차와 레포트점수의 표준편차를 구하여라. 어떤것이 더 큰가?

(6) test_dic에서 중간고사 점수가 가장 높은 사람의 학번을 출력하라.

주의: att,rep,mid,fin,key를 실행하여 소멸시키지 않고 그대로 이용하거나 np.random.choice()를 이용하여 재생성한 뒤 계산할 경우 0점 처리함.

  • 예를들면 (5)의 경우 np.std(mid), np.std(rep) 와 같은 식으로 구현하면 0점 처리함.

(7) 성공확률이 0.45인 시행이 있다고 하자. 이 시행을 100번의 시행하였을 경우 73번 이상 성공할 확률은 얼마인가? 시뮬레이션을 이용하여 근사계산하라.

(8) 성공확률이 0.45인 시행이 있다고 하자. 이 시행을 100번 시행하였을 경우 10번이하로 실패하거나 90번이상 성공할 확률은 얼마인가? 시뮬레이션을 이용하여 근사계산하라.

(9) 아래와 같은 행렬을 선언하자.

A=np.arange(2*1).reshape(2,1)
B=np.arange(2*2).reshape(2,2)
C=np.arange(2*3).reshape(2,3)
D=np.arange(3*3).reshape(3,3)
E=np.arange(3*2).reshape(3,2)
F=np.arange(3*1).reshape(3,1)

아래의 블락매트릭스를 만들어라.

$\begin{bmatrix} a_{11} & b_{11} & b_{12} & c_{11} & c_{12} & c_{13} \\ a_{21} & b_{21} & b_{22} & c_{21} & c_{22} & c_{23} \\ d_{11} & d_{12} & d_{13} & e_{11} & e_{12} & f_{11} \\ d_{21} & d_{22} & d_{23} & e_{21} & e_{22} & f_{21} \\ d_{31} & d_{32} & d_{33} & e_{31} & e_{32} & f_{31} \end{bmatrix}$

여기에서 $a_{ij}$는 매트릭스 ${\bf A}$의 원소이다.

(10) 표준정규분포에 10000개의 난수를 아래와 같이 생성하라.

x=np.random.randn(10000)
y=np.random.randn(10000)

$(i,j)$ 번째 원소가 $(x_i-y_i)^2$인 (10000,10000) 매트릭스를 만들어라.


(11)-(16)

아래와 같은 매트릭스를 생성하라.

np.random.seed(43052)
a=np.random.randn(10000).reshape(100,100)
a
array([[ 0.38342049,  1.0841745 ,  1.14277825, ..., -0.18506968,
         1.05538764,  1.18701443],
       [-0.25027283, -1.58045215,  0.1124153 , ...,  1.0321894 ,
         0.40438012, -0.13491595],
       [-0.76763724, -0.64294232, -0.24782396, ..., -0.01530161,
         0.89125897, -0.82683395],
       ...,
       [-1.41379028,  0.79611333, -0.71011837, ..., -0.9860352 ,
         1.30755244,  2.18677233],
       [ 1.33968105, -0.78457449, -0.10405858, ..., -0.71110186,
         0.99841286,  2.34371635],
       [-0.66422032, -0.07550233,  0.7405869 , ...,  1.03232398,
        -0.18988252, -0.03578389]])

(11) 각 행의 합을 구하라. 즉 1행의 합, 2행의 합, ... 100행의 합을 계산하라.

  • 1행의합 = 0.38342049 + 1.0841745 + ... + 1.18701443

(12) (11)의 결과로 나온 배열의 표준편차를 구하라.

(13) 각 열의 평균을 구하라. 즉 1열의 평균, 2열의 평균, ... , 100열의 평균을 계산하라.

(14) (13)의 결과로 나온 배열의 표준편차를 구하라.

(15) a의 원소중 a>0 을 만족하는 원소의 평균을 구하여라.

(16) a의 원소중 a>3을 만족하는 원소의 수를 count하라.


(17)-(18)

아래와 같은 배열 a를 고려하자.

np.random.seed(43052)
a=np.random.binomial(1,0.2,size=(10000,))
a
array([1, 0, 1, ..., 1, 1, 0])

(17) 0에서 1로 바뀌는 부분을 count하라.

(18) 1에서 0으로 바뀌는 부분을 count하라.

[예시] 아래의 배열에서 0에서 1로 부분은 모두 세 군데이고, 1에서 0으로 바뀌는 부분은 모두 두 군데 이다.

0 0 0 1 0 1 0 0 0 1 1 1

(19)-(25)

(19) $i=1,2,\dots,1000$에 대하여 아래를 각각 구하라.

$$x_i= \cos(t_i)+\cos(3t_i)+\cos(5t_i)$$

$$y_i= \sin(t_i)+\sin(4t_i)$$

여기에서 $t_i=\frac{2\pi i }{1000}$ 이다.

(20) $(x_i,y_i)$를 그려라.

(21) 아래와 같은 변환을 통하여 $(w_i,z_i)$를 얻어라.

$$w_i= \frac{1}{\sqrt{2}}x_i - \frac{1}{\sqrt{2}}y_i$$

$$z_i= \frac{1}{\sqrt{2}}x_i + \frac{1}{\sqrt{2}}y_i$$

$(w_i,z_i)$를 시각화 하라.

(22) 아래와 같은 매트릭스를 만들어라.

$${\bf A}=\begin{bmatrix} x_1 & y_1 \\ x_2 & y_2 \\ \dots & \dots \\ x_n & y_n \end{bmatrix}$$

(23) ${\bf A} {\bf B}$의 첫번째 열과 두번째 열을 시각화한 결과가 $(w_i,z_i)$과 동일하도록 적당한 (2,2) 매트릭스 ${\bf B}$를 만들어라.

(24) ${\bf A}{\bf B}^2$의 첫번째 열과 두번째 열을 시각화 하라.

(25) $n=3,4,5,6,\dots$ 에 대하여 ${\bf A}{\bf B}^n$을 반복적으로 그려보라. $(x_i,y_i)$의 시각화 결과와 동일한 가장 작은 $n$은 얼마인가? $(w_i,z_i)$의 시각화 결과와 동일한 가장 작은 $n$은 얼마인가?


3. 다음을 잘 읽고 물음에 답하라. (10점)

(1) 아래는 python을 설치하는 방법을 소개한 url 이다. 직접 url에 들어가서 설치하는 방법을 읽어보고 곤이, 철용, 아귀, 짝귀 중 옳은말을 한 사람을 모두 골라라.

(곤이) 해당 방법은 아나콘다를 이용하여 파이썬을 설치하는 방법이다.

(철용) 그래서 이 방법으로는 가상환경을 만들 수 없겠군.

(아귀) 위 url에 제시된 방법으로 설치하면 주피터가 자동설치 된다.

(짝귀) 따라서 위의 방법으로 설치하면 IDE는 주피터만 사용할 수 있다.

(2) 곤이는 1부터 10까지의 합을 구하는 코드를 작성하기 위하여 아래와 같이 mysum.py 파일을 만들었다.

## mysum.py
total = 0 
for i in range(1,11): 
    total = total + i
print(total)

곤이의 컴퓨터는 윈도우이며 아니콘다를 이용해 파이썬을 설치하였다고 가정한다. 다음중 옳은 설명을 한 사람을 모두 고르라.

(곤이) mysum.py를 실행하기 위해서는 anaconda prompt 에서 mysum.py가 위치한 폴더로 이동한 뒤 %run mysum.py 를 실행하면 된다.

(철용) ipython을 이용하여 실행하기 위해서는 anaconda prompt 에서 mysum.py가 위치한 폴더로 이동한 뒤 %run mysum.py을 실행해도 된다.

(아귀) 철용의 방법에서 %run mysum.py 대신에 !python mysum.py를 쳐도 동작한다.

(짝귀) 하지만 다른 가상환경을 만들 경우 철용과 아귀의 방법으로 실행할 수 없다는 단점이 있다.