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]]
import numpy as np
num_arr = np.arange(1, 21)
print(num_arr, end = '\n\n')
print(np.flip(num_arr), end = '\n\n')
print('num_arr 내의 모든 원소의 합 :', np.sum(num_arr), end = '\n\n')
print(np.reshape(num_arr, (5, 4)))
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20] [20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1] num_arr 내의 모든 원소의 합 : 210 [[ 1 2 3 4] [ 5 6 7 8] [ 9 10 11 12] [13 14 15 16] [17 18 19 20]]
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]]
import numpy as np
n_arr = np.arange(0, 25).reshape(5, 5)
print(n_arr, end = '\n\n')
print('첫 원소 :', n_arr[0][0])
print('마지막 원소 :', n_arr[-1][-1], end = '\n\n')
print(n_arr[0 : 2, :], end = '\n\n')
print(n_arr[2 :, :], end = '\n\n')
print(n_arr[:, 0 : 5 : 2], end = '\n\n')
print(n_arr[0 : 5 : 2, 0 : 5 : 2], end = '\n\n')
print(n_arr[0 : 2, :].reshape(5, 2))
[[ 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]] 첫 원소 : 0 마지막 원소 : 24 [[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]] [[ 0 2 4] [ 5 7 9] [10 12 14] [15 17 19] [20 22 24]] [[ 0 2 4] [10 12 14] [20 22 24]] [[0 1] [2 3] [4 5] [6 7] [8 9]]
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
import numpy as np
a = np.random.rand(3, 3, 3)
print(a, end = '\n\n')
print('a의 원소들 중 최대값 :', np.ndarray.max(a), end = '\n\n')
print('a의 원소들 중 최대값 :', np.ndarray.argmax(a))
[[[0.02775654 0.12800878 0.04330513] [0.4553351 0.61431011 0.20481864] [0.88035831 0.6693495 0.39070719]] [[0.58057744 0.71440558 0.81622601] [0.78673595 0.89925894 0.05606507] [0.04560794 0.57357087 0.90381068]] [[0.48788796 0.84367159 0.72546873] [0.97362673 0.54490973 0.67541559] [0.2104129 0.34840885 0.65021289]]] a의 원소들 중 최대값 : 0.9736267261559721 a의 원소들 중 최대값 : 21
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]
mtx = np.arange(0, 25).reshape(5, 5)
for i in range(0, 5):
for j in range(0, 5):
if (i + j)%2 == 0:
mtx[i, j] = 1
else:
mtx[i, j] = 0
print(mtx, end = '\n\n')
print('행렬의 행 방향 성분의 합 :')
print(np.sum(mtx, axis = 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]
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
import numpy as np
a = np.arange(0, 32).reshape(4, 4, 2)
print('10번째 원소 :', np.ndarray.flatten(a)[9])
print('20번째 원소 :', np.ndarray.flatten(a)[19])
10번째 원소 : 9 20번째 원소 : 19
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]
import numpy as np
A = np.random.randint(1, 51, size=10)
print('Random Array : ', A)
n = len(A)
for i in range(0, n):
for j in range(0, n - i - 1):
if A[j] > A[j + 1]:
temp1 = A[j]
temp2 = A[j + 1]
A[j] = temp2
A[j + 1] = temp1
print('Bubble Sort Result :', A)
Random Array : [10 49 9 35 20 14 6 40 38 36] Bubble Sort Result : [ 6 9 10 14 20 35 36 38 40 49]
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
import numpy as np
n = 100000000
x = np.random.randn(n)
y = np.random.randn(n)
z = 0
for i in range(n):
z += x[i]*y[i]
print(f'inner product: {z}')
inner product: 1159.0522902321209
b) 참고로, numpy 클래스는 다른 벡터와의 내적을 계산해 주는 dot() 메소드와 함수를 제공하며, 다음 두 가지 방법을 사용할 수 있다. a)에서 구현한 코드가 np.dot()함수와 동일한 결과를 출력하는지 확인하시오.
z = x.dot(y)
z = np.dot(x,y)
# your code here
import numpy as np
n = 100000000
x = np.random.randn(n)
y = np.random.randn(n)
z = np.dot(x,y)
print(f'inner product: {z}')
inner product: -3564.0670049173586
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
# your code here
import numpy as np
import time
n = 100000000
x = np.random.randn(n)
y = np.random.randn(n)
# a)
start_time = time.time()
z = 0
for i in range(n):
z += x[i]*y[i]
end_time = time.time()
print(f'inner product (a): {z}')
print(f'elapsed time(a): {end_time-start_time}')
# b)
start_time = time.time()
z = np.dot(x,y)
end_time = time.time()
print(f'inner product (b): {z}')
print(f'elapsed time(b): {end_time-start_time}')
inner product (a): 1227.5721577666668 elapsed time(a): 61.32597899436951 inner product (b): 1227.5721577637096 elapsed time(b): 0.11379265785217285