4.4.2 2차원 배열의 첨자와 슬라이싱
[비유로 이해하기: 색종이 오리기] 행(가로)과 열(세로) 범위를 동시에 지정하여, 거대한 원본 공간에서 사각형 모양의 조각을 떼어냅니다. (데이터는 복사되지 않고 참조 뷰(View)를 제공합니다.)
[실전 꿀팁]: 문제집(X)과 정답지(y) 나누기
보통 엑셀 파일 형식의 데이터에서 맨 마지막 열이 ‘결과값(정답)’인 경우가 많습니다. a[:, :-1]은 결과값을 제외한 전체 문제집(입력 데이터) 영역을 가져오며, a[:, -1]은 맨 끝줄 정답값 부분만 별도로 추출해 줍니다.
다음 a는 5행 6열의 원소 30개의 2차원 배열이다.
a = np.arange(30).reshape(5, 6)
a
출력:
array([[ 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, 25, 26, 27, 28, 29]])
2차원 배열에서 a[3]은 첨자 3인 1차원 행 배열이다.
a[3]
출력:
array([18, 19, 20, 21, 22, 23])
첨자는 음수도 가능하며 첨자 -1은 마지막 첨자이다.
a[-1]
출력:
array([24, 25, 26, 27, 28, 29])
2차원 배열에서 두 번째 첨자인 :는 생략해도 무방하다.
a[-2, :]
출력:
array([18, 19, 20, 21, 22, 23])
2차원 배열에서 a[1:3]는 첨자 1에서 3-1까지의 행인 2차원 배열이다.
a[2:4]
출력:
array([[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
다음 코드는 1행과 3행으로 구성된 2차원 배열이 반환된다.
a[1:5:2]
출력:
array([[ 6, 7, 8, 9, 10, 11],
[18, 19, 20, 21, 22, 23]])
다음 코드로 모든 행에 대해 열의 첨자 1인 1차원 배열이 반환된다.
a[:, 1]
출력:
array([ 1, 7, 13, 19, 25])
다음 코드로 열 첨자 1에서 5까지의 2차원 배열이 반환된다.
a[:, 1:6]
출력:
array([[ 1, 2, 3, 4, 5],
[ 7, 8, 9, 10, 11],
[13, 14, 15, 16, 17],
[19, 20, 21, 22, 23],
[25, 26, 27, 28, 29]])
다음 코드로 열 첨자 0, 2, 4로 구성된 2차원 배열이 반환된다.
a[:, ::2]
출력:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16],
[18, 20, 22],
[24, 26, 28]])
다음 코드 a[i, j]는 행 첨자 i, 열 첨자 j인 스칼라 값이 반환된다.
a[2, 4]
출력:
16
다음 코드 a[i][j]는 a[i, j]와 같다.
a[2][4]
출력:
16
다음 코드로 행 첨자 1, 2, 열 첨자 2, 3, 4로 구성되는 2차원 배열이 반환된다.
a[1:3, 2:5]
출력:
array([[ 8, 9, 10],
[14, 15, 16]])
다음 코드로는 같은 배열 a가 반환된다.
a[:, :]
출력:
array([[ 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, 25, 26, 27, 28, 29]])
다음 코드로는 원 배열 a의 행과 열이 모두 역순인 배열이 반환된다.
a[::-1, ::-1]
출력:
array([[29, 28, 27, 26, 25, 24],
[23, 22, 21, 20, 19, 18],
[17, 16, 15, 14, 13, 12],
[11, 10, 9, 8, 7, 6],
[ 5, 4, 3, 2, 1, 0]])