올리는 내용은 과제이다. 별 건 아니지만 했는김에 올려보겠다.
예를 들어 다음과 같은 행렬이 주어져 있을 때
import numpy as np
M = np.arange(20).reshape(4,5)
print(M)
우리의 목표는 다음의 결과에 해당하는 1-d array를 찾는 것이다.
즉 결과는 [ 0 1 2 3 4 9 14 19 18 17 16 15 10 5 6 7 8 13 12 11]
가 되어야 한다.
먼저 행렬의 가장자리를 둘러서 [ 0 1 2 3 4 9 14 19 18 17 16 15 10 5]
를 얻는 함수를 만든다.
위 그림을 보면 순서대로 가다가 마지막행[15 16 17 18 19]
와 첫번째 열의[5 10 15]
는 역순으로 출력이 되어야 한다.
def reverse(m) :
return m[::-1]
def Border(m):
reverse_last_row = reverse(m[-1])
reverse_first_col = reverse(m[1:-1,0])
return np.r_[m[0, :],m[1:-1,-1], reverse_last_row, reverse_first_col]
행렬이 아래 사진과 같이 n=1 혹은 m=1일 경우에 대해서도 가장자리의 값들을 얻을 수 있도록 코드를 수정한다.
def Border(m):
A = []
reverse_last_row = reverse(m[-1])
reverse_first_col = reverse(m[1:-1,0])
if (m[:, 0] == m[:, -1]).all(): #열이 하나일 때
A = np.r_[m[0, :], m[1:-1,-1], m[-1]]
elif len(m) == 1: #행이 하나일 때
A = np.r_[m[0, :]]
else :
A = np.r_[m[0, :],m[1:-1,-1], reverse_last_row, reverse_first_col]
return A
행렬의 가장자리를 두르고 남은 나머지 부분을 얻는 함수를 만든다.
def Inner(m):
a = m[1:-1,1:-1]
return a
최종 결과를 얻는 함수를 만든다.
def d_array(D):
array = []
while(1):
# array = 이전 턴의 array + 이번 턴에 얻은 가장자리 값들로 이루어진리스트
array = np.r_[array,Border(D)]
# 행렬의 나머지 부분을 새로운 행렬로 대입
D = Inner(D)
if len(D) <= 1:
break
return array
첫번째 턴에서 array = [] + [0 1 2 3 4 9 14 19 18 17 16 15 10 5]
가 되고 D = [6 7 8 13 12 11]
이 된다.
이어지는 두번째 턴에서 array = [0 1 2 3 4 9 14 19 18 17 16 15 10 5] + [6 7 8 13 12 11]
가 되고 D = []
가 된다. len(D) = 0
이므로 반복문을 탈출한다.