문제1¶
임의의 모양을 가진 numpy.ndarray 타입의 2차원 행렬이 주어진다. numpy를 활용하여 (y1, x1)에서 (y2, x2)까지 구간에 해당하는 모든 요소 값에 2를 곱하여 반환하는 함수를 제작하라.
In [4]:
import numpy as np
# test_arr 생성
test_arr = np.array([
[ 1, 5, 3, 4, 5, 5, 4, 2, 10, 9],
[ 7, 3, 2, 5, 2, 7, 8, 2, 5, 3],
[ 3, 2, 5, 6, 7, 8, 2, 10, 6, 5],
[ 4, 7, 6, 6, 5, 5, 6, 7, 1, 2]
])
test_arr
Out[4]:
array([[ 1, 5, 3, 4, 5, 5, 4, 2, 10, 9], [ 7, 3, 2, 5, 2, 7, 8, 2, 5, 3], [ 3, 2, 5, 6, 7, 8, 2, 10, 6, 5], [ 4, 7, 6, 6, 5, 5, 6, 7, 1, 2]])
In [6]:
# 이전 복습을 통하여
# 우리는 슬라이싱을 활용해 2차원 배열에 접근이 가능하다는 사실을
# 인지한 바 있다.
# 행 0 이상 3 미만의 인덱스 추출, 열 0이상 3 미만의 인덱스 추출하여 접근
test_arr[0:3, 0:3]
Out[6]:
array([[1, 5, 3], [7, 3, 2], [3, 2, 5]])
In [7]:
# 접근된 값에는 계산도 가능했다.
test_arr[0:3, 0:3] * 2
Out[7]:
array([[ 2, 10, 6], [14, 6, 4], [ 6, 4, 10]])
In [18]:
# 따라서 위 내용을 적용하여 정답을 입력한다.
x1 = 1
x2 = 4
y1 = 0
y2 = 2
# 이상 ~ 미만을 고려하여 작성한다.
# Y = row, X = column임을 주의한다.
# (인덱싱할 위치) = (인덱싱할 위치를 바꾸어줄 값)
test_arr[y1:y2 + 1, x1:x2 + 1] = test_arr[y1:y2 + 1, x1:x2 + 1] * 2
In [19]:
# 값이 원하는 내용으로 변경된 것을 확인할 수 있다.
test_arr
Out[19]:
array([[ 1, 10, 6, 8, 10, 5, 4, 2, 10, 9], [ 7, 6, 4, 10, 4, 7, 8, 2, 5, 3], [ 3, 4, 10, 12, 14, 8, 2, 10, 6, 5], [ 4, 7, 6, 6, 5, 5, 6, 7, 1, 2]])
문제2¶
Y = X * transpose(W) + b 를 계산하라.
In [22]:
X = [1, 2, 3]
W = [3, 4, 5]
b = 7
X = np.array(X)
W = np.transpose(W)
In [24]:
# 행렬의 곱은 .odt으로 처리할 수 있다.
dot = np.dot(X, W)
dot
Out[24]:
26
In [25]:
dot + b
Out[25]:
33
문제3¶
사용자에게는 2차원 배열이 주어진다. 첫번째 행은 정보A가 있고, 두번째 행은 정보B가 있다고 가정하자. 즉, 하나의 열이 한 사람의 정보인 것이다. 두 조건 중 하나라도 해당되는 사람의 인덱스를 추출하는 알고리즘을 구현하라.
- 조건1. 정보A는 150 미만, 195 초과
조건2. 정보B는 140 이상
정답은 list로 반환한다.
In [27]:
test_A = ([
[151.4, 172.45, 138.65, 177.63, 207.46],
[44.64, 163.5, 112.35, 73.55, 97.83]
])
test_A
Out[27]:
[[151.4, 172.45, 138.65, 177.63, 207.46], [44.64, 163.5, 112.35, 73.55, 97.83]]
np.where(test_A < 150)
과 같이 입력할 때, 아래와 같은 TypeError가 출력됨.- TypeError: '<' not supported between instances of 'list' and 'int'
- 2차원 배열을 조건으로 둘 시 발생하는 오류라고 추측하여 조건문을 모두 1차원배열화 한 후 작업 실시
In [85]:
# np.where(test_A < 150) 과 같이 입력할 때
# TypeError: '<' not supported between instances of 'list' and 'int' 발생
#
A = test_A[0]
A = np.array(A)
A
Out[85]:
array([151.4 , 172.45, 138.65, 177.63, 207.46])
In [86]:
B = test_A[1]
B = np.array(B)
B
Out[86]:
array([ 44.64, 163.5 , 112.35, 73.55, 97.83])
In [96]:
A_result = np.where((A < 150) | (A > 195))
A_result
Out[96]:
(array([2, 4], dtype=int64),)
In [88]:
B_result = np.where(B >= 140)
B_result
Out[88]:
(array([1], dtype=int64),)
- 이때,
np.where()
로 출력된 값 타입은 tuple이며, - 출력된 값의 [0]인덱스를 출력해야 np.array형식이라는 것이다.
In [91]:
type(A_result)
Out[91]:
tuple
In [92]:
type(A_result[0])
Out[92]:
numpy.ndarray
- 따라서, A_result[0]을 list화한 후, 두 리스트를 서로 더해준다.
In [97]:
A_result = A_result[0].tolist()
In [98]:
A_result
Out[98]:
[2, 4]
In [99]:
B_result = B_result[0].tolist()
In [100]:
B_result
Out[100]:
[1]
In [115]:
# 이후 두 리스트를 더해준다.
result = A_result + B_result
result
Out[115]:
[2, 4, 1]
In [116]:
# 이때, 주의할 점은 두 리스트 값의 중복값이 없어야 한다는 것이다.
# 따라서 자료구조 set을 활용하여 중복값을 제거한다.
list(set(result))
Out[116]:
[1, 2, 4]
'전문지식 함양 > TIL' 카테고리의 다른 글
[프로그래머스 겨울방학 인공지능 과정] numpy 복습 및 심화문제 (0) | 2022.01.20 |
---|---|
[프로그래머스 겨울방학 인공지능 과정] np.where (0) | 2022.01.19 |
[프로그래머스 겨울방학 인공지능 과정] numpy 복습 (0) | 2022.01.17 |
[프로그래머스 겨울방학 인공지능 과정] EDA Project2 (0) | 2022.01.15 |
[프로그래머스 겨울방학 인공지능 과정] EDA Project1 (0) | 2022.01.14 |