9.1 다음 코드를 작성하시오.
a) numpy의 arange() 함수를 사용하여 1에서 20까지의 연속된 정수값을 가지는 1차원 배열 num_arr을 생성하여라.
[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20]
b) num_arr을 역순으로 출력하라.
[20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1]
c) num_arr 원소들의 합을 구하여 출력하라.
num_arr 내의 모든 원소의 합 : 210
d) num_arr을 5행 4열의 2차원 배열로 형태를 변경하라.
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]
[13 14 15 16]
[17 18 19 20]]
# your code here
9.2 다음 문제들을 numpy을 활용해 해결하라.
a) 0에서 20까지의 값을 가지는 5x5 크기의 2차원 배열 n_arr을 생성하여라.
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
b) n_arr의 가장 첫 원소와 가장 마지막 원소를 인덱싱하여 다음과 같이 출력하라. 마지막 원소의 인덱싱은 반드시 음수 값을 사용하라.
첫 원소 : 0
마지막 원소 : 24
c) n_arr 배열에 슬라이싱을 적용하여 다음과 같은 값을 가지는 배열을 생성하라.
[[0 1 2 3 4]
[5 6 7 8 9]]
d) n_arr 배열에 슬라이싱을 적용하여 다음과 같은 값을 가지는 배열을 생성하라.
[[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
e) n_arr 배열에 슬라이싱을 적용하여 다음과 같은 값을 가지는 배열을 생성하라.
[[ 0 2 4]
[ 5 7 9]
[10 12 14]
[15 17 19]
[20 22 24]]
f) n_arr 배열에 슬라이싱을 적용하여 다음과 같은 값을 가지는 배열을 생성하라.
[[ 0 2 4]
[10 12 14]
[20 22 24]]
g) n_arr 배열에 슬라이싱을 적용한 후, reshape()을 적용하여 다음과 같은 값을 가지는 배열을 생성하라.
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
# your code here
9.3 다음 코드를 작성하시오.
a) 다음과 같이 난수로 이루어진 3x3x3 형태의 배열 a을 생성하라.
[[0.09347106 0.19835688 0.65493805]
[0.36101534 0.13063162 0.26222541]
[0.41433707 0.14831801 0.87928220]]
[[0.41884165 0.88340306 0.42885613]
[0.55914641 0.82119850 0.22334602]
[0.00488979 0.37834161 0.55276553]]
[[0.28075227 0.94136013 0.47217432]
[0.36999284 0.06071178 0.33098252]
[0.61553424 0.09878582 0.92740356]]
b) a 배열에서 가장 큰 값을 구하여 다음과 같이 출력하여라(ndarray에서 제공하는 max() 함수 이용).
a의 원소들 중 최대값 : 0.9413601316093838
c) a 배열에서 가장 큰 값이 몇 번째 있는지 구하여 다음과 같이 출력하여라(ndarray에서 제공하는 argmax() 함수 이용).
a의 원소들 중 최대값의 위치 : 19
# your code here
9.4 다음 코드를 작성하시오.
a) numpy의 인덱싱 기능을 활용하여 5x5 크기의 행렬을 생성하라. 이 행렬의 내부는 모두 0과 1로 이루어져 있으며, 그 패턴은 다음과 같이 체크판 형태를 가진다.
[[1 0 1 0 1]
[0 1 0 1 0]
[1 0 1 0 1]
[0 1 0 1 0]
[1 0 1 0 1]]
이 행렬의 행방향 성분의 합을 다음과 같이 출력하라.
행렬의 행 방향 성분의 합 :
[3 2 3 2 3]
# your code here
9.5 0에서 32까지의 값을 순서대로 가지는 (4, 4, 2) 형태의 3차원 배열 a가 다음과 같이 있다. 이 배열에 대하여 10번째와 20번째 원소를 구하는 식을 만드시오(flatten() 함수 이용).
import numpy as np
a = np.arange(0, 32).reshape(4, 4, 2)
10번째 원소 : 9
20번째 원소 : 19
# your code here
9.6 $Bubble~Sort$
Bubble Sort 알고리즘은 가장 단순한 정렬 알고리즘 중 하나이다. 임의의 배열에 대해, bubble sort 알고리즘은 첫 번째와 두 번째 원소의 크기를 비교해 큰 원소를 배열의 두 번째 자리로, 작은 원소를 첫 번째 자리로 이동시킨다. 그리고 두 번째와 세 번째 원소의 크기를 비교해 마찬가지로 큰 원소를 배열의 세 번째 자리로, 작은 원소를 두 번째 자리로 이동시킨다. 배열의 마지막 원소에 도달할 때까지 이 과정을 반복하면 배열의 마지막 자리에 가장 큰 원소가 위치하게 된다. 다음으로 위 과정을 다시 반복하되, 이번에는 배열의 마지막 원소에 도달하기 직전까지 반복한다. 이 과정을 마치면 배열의 마지막과 마지막 직전 자리에는 각각 가장 큰 원소와 두 번째로 큰 원소가 위치할 것이다. 이를 계속 반복하면 배열의 마지막 자리에 가장 큰 원소가, 첫 번째 자리에 가장 작은 원소가 위치하도록 정렬할 수 있다.
1에서 50 사이의 정수로 구성된 1x10 크기의 랜덤 배열을 선언하고, bubble sort 알고리듬을 구현하여 해당 배열을 오름차순으로 정렬하시오.
Random Array : [39 40 3 25 13 29 2 20 10 39]
Bubble Sort Result : [ 2 3 10 13 20 25 29 39 39 40]
# your code here
9.7 Inner product
$n$ 개의 원소를 갖는 $n-$차원 벡터 $x$와 $y$의 내적 (inner product) $z=x^Ty$는 다음과 같이 정의된다.
$$ z = x^Ty = \sum_{i=1}^{n} x_i y_i $$a) 1억개의 랜덤한 숫자들을 원소로 갖는 벡터 $x$와 $y$를 생성하고, 그 둘의 내적을 계산하는 코드를 작성하시오.
# your code here
b) 참고로, numpy 클래스는 다른 벡터와의 내적을 계산해 주는 dot() 메소드와 함수를 제공하며, 다음 두 가지 방법을 사용할 수 있다. a)에서 구현한 코드가 np.dot()함수와 동일한 결과를 출력하는지 확인하시오.
z = x.dot(y)
z = np.dot(x,y)
# your code here
c) a)에서 구현한 코드가 1억차원의 벡터 내적을 계산하는 데 소요된 연산 시간과 np.dot() 함수가 같은 결과를 얻어내는 데 소요된 연산 시간을 비교하시오. 코드 수행 시간은 다음과 같이 time 모듈의 time.time() 함수를 이용하여 측정할 수 있다.
import time
start_time = time.time()
####
####
####
end_time = time.time()
elapsed_time = end_time - start_time
print(f'Elapsed time: {elapsed_time} (sec)')
# your code here