인덱싱과 슬라이싱 — x[:, 1]과 x[:, 1:2]는 어떻게 다를까 ★★★ 시험 단골
Tensor에서 일부를 꺼내는 방법이에요. 규칙은 0장에서 배운 리스트와 똑같고, 2차원이면 x[행, 열]처럼 쉼표로 자리를 나눠요. 번호는 0부터이고, 콜론 :은 "그 자리 전부"예요.
| x (3행 4열) | 열 0 | 열 1 | 열 2 | 열 3 |
|---|---|---|---|---|
| 행 0 | 10 | 20 | 30 | 40 |
| 행 1 | 50 | 60 | 70 | 80 |
| 행 2 | 90 | 100 | 110 | 120 |
| 코드 줄 | 무슨 뜻 |
|---|---|
x[0, 0] | 0행 0열 한 칸 → 10 |
x[1, 2] | 1행 2열 한 칸 → 70 |
x[0, :] | 0행, 열은 전부 → 첫 번째 행 전체 |
x[:, 1] | 행은 전부, 열은 1번 → 두 번째 열 전체 [20, 60, 100] |
x[:2, :] | 행은 0, 1번(처음~2 앞), 열은 전부 → 앞의 두 행 |
x[1:, 1:3] | 행은 1번부터 끝까지, 열은 1, 2번 → 오른쪽 일부 영역 |
x[::2, ::2] | 행도 열도 2칸씩 건너뛰기 → 0, 2행과 0, 2열의 교차점 |
이제 가장 중요한 부분이에요. 정수로 고르면 그 차원이 사라지고, 슬라이스(a:b)로 고르면 길이가 1이어도 차원이 남아요.
자리에 "숫자 하나"를 쓰면 그 방향이 사라지고(shape에서 빠짐), 자리에 "a:b"를 쓰면 그 방향이 남아요(shape에 길이가 남음). 그래서 x[:, 1]은 한 줄(1차원)이고 x[:, 1:2]는 열 하나짜리 표(2차원)예요.
엑셀에서 B열을 복사했는데 "한 줄로 쭉 풀어서 가져온 것"(1차원)과 "표 모양 그대로 열 하나만 가져온 것"(2차원)은 달라요. x[:, 1]은 풀어서 가져온 것이고, x[:, 1:2]는 표 모양을 유지한 것이에요.
1단계 — x를 만들어요. arange(12)는 0~11이고, reshape(3, 4)로 3행 4열로 나눠요.
| x | 열 0 | 열 1 | 열 2 | 열 3 |
|---|---|---|---|---|
| 행 0 | 0 | 1 | 2 | 3 |
| 행 1 | 4 | 5 | 6 | 7 |
| 행 2 | 8 | 9 | 10 | 11 |
2단계 — a = x[:, 1]. 열 자리에 정수 1 → 열 방향이 사라져요. 남는 건 행 방향 3개 한 줄이에요. 값은 [1, 5, 9], shape은 (3,).
3단계 — b = x[:, 1:2]. 열 자리에 1:2 → "1번 열부터 2 앞까지"라서 같은 열이지만 열 방향이 길이 1로 남아요. 값은 [[1], [5], [9]], shape은 (3, 1).
그래서 출력은 (3,), (3, 1)이고 정답은 ② (3,) → (3, 1)이에요. 나머지 선택지는 이렇게 걸러져요.
| 선택지 | 왜 오답인가 |
|---|---|
| ① (3,) → (3,) | 둘이 같다고 했지만 슬라이스 1:2는 차원을 남겨요 |
| ③ (1, 3) → (3, 1) | a는 "한 행"이 아니라 길이 3짜리 한 줄이에요. (1, 3)이면 행이 1개 있는 표예요 |
| ④ (4,) → (4, 1) | 열을 골랐는데 길이가 4이면 행 방향이 4여야 해요. x는 3행이라 3이에요 |
| ⑤ (3, 1) → (3, 1) | 정수 1로 고른 a는 차원이 사라져서 (3, 1)이 될 수 없어요 |
같은 규칙으로 아래 결과를 표로 외워 두면 편해요. (x는 위 3×4 표예요.)
| 코드 | shape | 이유 |
|---|---|---|
x[:, 1] | (3,) | 열 자리가 정수 → 열 방향 사라짐 |
x[:, 1:2] | (3, 1) | 열 자리가 슬라이스 → 열 방향 길이 1로 남음 |
x[1] | (4,) | 행 자리가 정수 → 행 방향 사라짐. 열은 전부 |
x[1:2] | (1, 4) | 행 자리가 슬라이스 → 행 방향 길이 1로 남음 |
x[0, 0] | () | 둘 다 정수 → 둘 다 사라져 숫자 하나(0차원) |
x[0:1, 0:1] | (1, 1) | 둘 다 슬라이스 → 둘 다 남음 |
음수 번호도 써요. x[:, -1]은 맨 마지막 열, x[-1, :]은 맨 마지막 행, x[-2:, -2:]는 "오른쪽 아래 2×2 영역"이에요(수업 실습 4).
"숫자는 지우고, 콜론은 남긴다". x[:, 1]은 숫자가 열을 지워 한 줄, x[:, 1:2]는 콜론(범위)이 열을 남겨 표예요. 답을 낼 때는 자리마다 "정수인가, 범위인가"만 표시하세요.
① 원래 shape을 확인한다. ② 자리마다 정수(차원 삭제)인지 슬라이스(차원 유지)인지 구분한다. ③ 슬라이스 길이는 끝 − 시작이다(1:2는 1개, :2는 2개). ④ 남은 차원들의 크기를 순서대로 적으면 shape이다. 값을 직접 쓸 때는 0부터 번호를 붙인 표를 그려요.
잠깐 확인 — x가 (3, 4)일 때 x[1:3, 2]의 shape은?
(2,)예요. 행은 1~2번(2개)으로 남고, 열은 정수 2라서 사라져요.
자료: 2주차 · Week02_Tensor_and_GPU(pdf, 풀이포함 ipynb) · 빅분02(2주차) 녹취