P2-11.2 인덱싱(indexing), 슬라이싱(slicing), 축(axis)¶
Section ID:
P2-11.2Version:v2026.07.20
P2-11.1에서는 NumPy 배열(array)을 만들고, shape, ndim, dtype을 확인했습니다. 이제 배열 안에서 어느 값을 읽을지, 어느 구간을 잘라 볼지, 어느 방향으로 계산할지를 봅니다.
NumPy 배열을 읽을 때 자주 만나는 말은 세 가지입니다.
인덱싱(indexing), 슬라이싱(slicing), 축(axis).
이 세 말은 비슷해 보이지만 역할이 다릅니다. 인덱싱은 위치를 고릅니다. 슬라이싱은 구간을 고릅니다. 축은 계산의 방향을 정합니다.
여기서는 인덱싱(indexing), 슬라이싱(slicing), 축(axis)의 기본 구분을 설명합니다. NumPy와 배열 기본 속성은 P2-11.1과 개념사전에서 다시 확인할 수 있고, 여기서는 그 배열에서 무엇을 고르고 어느 방향으로 읽는지에 집중합니다.
핵심 기준: 인덱싱(indexing), 슬라이싱(slicing), 축(axis)¶
x[0],x[1, 2]같은 인덱싱을 위치 선택으로 설명할 수 있습니다.x[1:3],x[:, 0],x[0:2, 1:3]같은 슬라이싱을 구간 선택으로 설명할 수 있습니다.- 2차원 배열에서 첫 번째 축(axis 0)을 행 방향, 두 번째 축(axis 1)을 열 방향으로 읽을 수 있습니다.
sum(axis=0)과sum(axis=1)의 결과 shape이 왜 다른지 설명할 수 있습니다.- 데이터셋에서 행은 샘플, 열은 특징으로 읽히는 경우가 많다는 관점을 설명할 수 있습니다.
먼저 붙잡을 한 장면¶
이 절에서 가장 먼저 붙잡아야 할 장면은 다음입니다.
| 배열 표현 | 데이터셋처럼 읽을 때 먼저 떠올릴 질문 |
|---|---|
shape = (4, 3) | 샘플이 4개인가, 특징이 3개인가 |
x[1, :] | 두 번째 샘플 하나를 고르는가 |
x[:, 2] | 세 번째 특징 열 전체를 고르는가 |
sum(axis=0) | 특징별 요약을 남기는가 |
sum(axis=1) | 샘플별 요약을 남기는가 |
즉 인덱싱, 슬라이싱, 축(axis)은 따로 외우는 문법이 아니라, 지금 한 샘플을 보고 있는가, 한 특징 전체를 보고 있는가, 어느 방향으로 요약하는가를 배열 위에서 분명히 적는 방법입니다.
세 가지 기준¶
| 기준 | 왜 중요한가 | 이 절에서 필요한 이해 수준 |
|---|---|---|
| 인덱싱이 무엇인가 | 배열 읽기에서 위치 선택과 구간 선택을 섞지 않게 해 줍니다. | 하나의 정확한 위치를 고르는 일로 이해합니다. |
| 슬라이싱이 무엇인가 | 값 하나와 부분 배열을 구분해 읽게 해 줍니다. | 한 점이 아니라 구간을 남기는 일로 이해합니다. |
| 축이 왜 중요한가 | 뒤의 집계와 브로드캐스팅 계산 방향을 읽는 기준이 됩니다. | 배열 계산이 어느 방향으로 진행되는지 정하는 기준으로 이해합니다. |
| 용어 | 이 절에서 먼저 잡을 뜻 |
|---|---|
| 인덱싱(indexing) | 하나의 정확한 위치를 고르는 읽기 방식입니다. |
| 슬라이싱(slicing) | 시작과 끝을 정해 구간을 남기는 읽기 방식입니다. |
| 축(axis) | 배열 계산이 어느 방향으로 진행되는지 정하는 기준입니다. |
| 행(row) | 2차원 배열에서 가로줄 한 줄입니다. |
| 열(column) | 2차원 배열에서 세로 방향 한 줄입니다. |
인덱싱은 위치를 고르는 일이다¶
NumPy 공식 문서는 ndarray가 표준 Python 문법인 x[obj] 형태로 인덱싱될 수 있다고 설명합니다. 또한 Python처럼 인덱스는 0부터 시작합니다.
먼저 1차원 배열을 봅니다.
문제 상황: 1차원 배열에서 몇 번째 값을 고르는 기본 인덱싱을 확인합니다. 입력(input): 점수 네 개를 담은 1차원 배열 scores입니다. 기대 출력(output): 첫 번째 값 82와 세 번째 값 45가 출력됩니다. 확인할 개념: 인덱싱은 하나의 정확한 위치를 고르는 일이며, 위치 번호는 0부터 시작한다는 점을 봅니다.
출력은 다음과 같습니다.
scores[0]은 첫 번째 값입니다. scores[2]는 세 번째 값입니다. Python과 NumPy에서는 보통 첫 위치를 1이 아니라 0으로 셉니다.
이 점은 자주 헷갈립니다.
| 표현 | 읽는 법 | 결과 |
|---|---|---|
scores[0] | 0번 위치 | 82 |
scores[1] | 1번 위치 | 75 |
scores[2] | 2번 위치 | 45 |
scores[-1] | 마지막 위치 | 90 |
인덱싱은 “몇 번째 값인가”를 묻는 작업입니다.
2차원 배열은 행과 열을 함께 고른다¶
2차원 배열에서는 보통 행(row)과 열(column)을 함께 지정합니다.
문제 상황: 2차원 배열에서 행과 열 위치를 함께 지정해 한 값을 고릅니다. 입력(input): 3행 4열 배열 data와 위치 [1, 2]입니다. 기대 출력(output): 전체 shape와 선택된 값 22가 출력됩니다. 확인할 개념: data[행, 열] 표기가 한 값을 고르는 기본 문법이라는 점을 확인합니다.
출력은 다음과 같습니다.
data[1, 2]는 1번 행, 2번 열의 값을 고릅니다.
여기서도 인덱스는 0부터 시작합니다.
| 표현 | 읽는 법 | 결과 |
|---|---|---|
data[0, 0] | 0번 행, 0번 열 | 10 |
data[0, 3] | 0번 행, 3번 열 | 13 |
data[1, 2] | 1번 행, 2번 열 | 22 |
data[2, 1] | 2번 행, 1번 열 | 31 |
2차원 배열에서 쉼표는 차원을 나누는 표시로 볼 수 있습니다. 따라서 data[행, 열]처럼 읽으면 됩니다.
슬라이싱은 구간을 남기는 일이다¶
슬라이싱(slicing)은 하나의 위치가 아니라 구간을 선택합니다.
문제 상황: 1차원 배열에서 중간 구간만 잘라 보고 싶습니다. 입력(input): 점수 네 개를 담은 배열과 슬라이스 1:3입니다. 기대 출력(output): 두 번째와 세 번째 값만 남은 배열이 출력됩니다. 확인할 개념: 슬라이싱은 시작 위치부터 끝 위치 전까지의 구간을 남긴다는 점을 봅니다.
출력은 다음과 같습니다.
1:3은 1번 위치부터 3번 위치 전까지를 뜻합니다. 즉 1번과 2번 위치가 선택됩니다.
여기서는 이렇게 기억합니다.
| 표현 | 의미 |
|---|---|
start:stop | start부터 stop 전까지 |
: | 전체 |
:3 | 처음부터 3 전까지 |
1: | 1부터 끝까지 |
::2 | 두 칸씩 건너뛰기 |
슬라이싱은 “어느 구간을 남길 것인가”를 묻는 작업입니다.
아래 도식은 start:stop:step 표기를 한 줄 배열에서 어떻게 읽는지 보여 줍니다.
여기서 중요한 점은 stop 위치의 값은 선택되지 않는다는 것입니다. scores[1:5:2]는 1번 위치에서 시작해 5번 위치 전까지 보되, 두 칸씩 이동합니다.
문제 상황: 슬라이싱에서 start:stop:step 조합이 어떻게 다른 결과를 만드는지 한 번에 비교합니다. 입력(input): 점수 여섯 개를 담은 배열과 여러 슬라이스 표현입니다. 기대 출력(output): 연속 구간, 두 칸 간격 구간, 앞부분, 뒷부분이 각각 출력됩니다. 확인할 개념: 슬라이싱은 구간 시작과 종료, 간격을 함께 조절할 수 있다는 점을 봅니다.
출력은 다음과 같습니다.
행과 열을 자르는 법¶
2차원 배열에서 :를 쓰면 행이나 열 전체를 고를 수 있습니다.
문제 상황: 같은 2차원 배열에서 한 행 전체와 한 열 전체를 각각 고릅니다. 입력(input): 3행 4열 배열 data와 data[2, :], data[:, 3] 선택입니다. 기대 출력(output): 세 번째 행 전체와 네 번째 열 전체가 출력됩니다. 확인할 개념: :는 해당 축 전체를 뜻하며, 행 선택과 열 선택을 나누어 읽어야 한다는 점을 봅니다.
출력은 다음과 같습니다.
data[2, :]는 2번 행의 모든 열을 고릅니다.
data[:, 3]는 모든 행에서 3번 열을 고릅니다.
아래 도식은 같은 배열을 인덱싱, 행 슬라이싱, 열 슬라이싱으로 다르게 읽는 상황을 보여 줍니다.
이 도식에서 파란색은 하나의 값, 초록색은 한 행, 주황색은 한 열을 강조합니다. 모두 같은 배열에서 나온 선택입니다.
작은 영역을 자를 수도 있다¶
행과 열의 구간을 함께 지정하면 작은 부분 배열(sub-array)을 만들 수 있습니다.
문제 상황: 2차원 배열에서 행 구간과 열 구간을 동시에 지정해 작은 사각형 영역만 남깁니다. 입력(input): 배열 data와 슬라이스 data[0:2, 1:3]입니다. 기대 출력(output): 2행 2열 부분 배열이 출력됩니다. 확인할 개념: 슬라이싱은 여러 축의 구간을 함께 고를 수 있다는 점을 봅니다.
출력은 다음과 같습니다.
data[0:2, 1:3]은 0번 행부터 2번 행 전까지, 1번 열부터 3번 열 전까지로 읽습니다.
즉 0번과 1번 행, 1번과 2번 열이 남습니다.
슬라이싱은 원본 배열 전체를 바꾸는 일이 아니라, 필요한 구간을 읽는 방식으로 먼저 이해하면 됩니다. 다만 슬라이싱 결과가 원본과 어떻게 연결되는지는 P2-11.4 보충학습에서 다시 봅니다.
축(axis)은 계산의 방향을 정한다¶
NumPy 용어집은 축(axis)을 배열의 차원을 가리키는 말로 설명합니다. 축은 왼쪽에서 오른쪽으로 번호가 붙고, axis 0은 shape 튜플의 첫 번째 요소입니다. 2차원 배열에서는 axis 0이 행 방향, axis 1이 열 방향으로 설명됩니다.
여기서는 다음처럼 이해합니다.
문제 상황: 2차원 배열의 shape를 보고 축 번호가 무엇을 뜻하는지 확인합니다. 입력(input): 3행 4열 배열 data의 shape입니다. 기대 출력(output): (3, 4)가 출력됩니다. 확인할 개념: axis=0은 첫 번째 차원, axis=1은 두 번째 차원이라는 해석이 shape와 연결된다는 점을 봅니다.
이 결과가 (3, 4)라면 다음처럼 읽습니다.
| 축 | shape에서의 위치 | 이 예제의 의미 |
|---|---|---|
axis=0 | 첫 번째 숫자 3 | 행이 3개 |
axis=1 | 두 번째 숫자 4 | 열이 4개 |
축은 특히 sum, mean 같은 요약 계산에서 중요합니다.
문제 상황: 같은 배열이라도 어느 축을 따라 더하느냐에 따라 결과가 어떻게 달라지는지 비교합니다. 입력(input): 3행 4열 배열 data와 sum(axis=0), sum(axis=1)입니다. 기대 출력(output): 열별 합 배열과 행별 합 배열이 각각 출력됩니다. 확인할 개념: 축은 위치 번호가 아니라 계산 방향을 정하며, 결과 shape도 달라진다는 점을 봅니다.
출력은 다음과 같습니다.
sum(axis=0)은 행 방향을 따라 내려가며 더합니다. 그래서 열마다 하나의 합이 남습니다.
sum(axis=1)은 열 방향을 따라 가로로 더합니다. 그래서 행마다 하나의 합이 남습니다.
아래 도식은 축에 따라 어떤 방향이 접히고 어떤 결과가 남는지 보여 줍니다.
중요한 점은 axis=0이 “0번 행을 고른다”는 뜻이 아니라는 것입니다. 인덱싱에서 0은 위치를 고르는 숫자입니다. 하지만 axis=0은 계산이 진행되는 차원을 지정합니다.
행은 샘플, 열은 특징으로 자주 읽힌다¶
AI 실습에서 2차원 배열은 자주 다음처럼 읽힙니다.
| 방향 | 자주 쓰는 해석 |
|---|---|
| 행(row) | 샘플(sample), 데이터 한 건 |
| 열(column) | 특징(feature), 변수(variable) |
예를 들어 다음 배열을 봅니다.
문제 상황: 데이터셋처럼 읽히는 배열에서 한 샘플과 한 특징 열을 각각 꺼내 봅니다. 입력(input): 샘플 3개, 특징 2개로 읽을 수 있는 features 배열입니다. 기대 출력(output): 출력은 없지만 샘플-특징 구조 예제가 준비됩니다. 확인할 개념: 2차원 배열은 행을 샘플, 열을 특징으로 읽는 경우가 많다는 점을 봅니다.
이 배열은 샘플 3개와 특징 2개로 읽을 수 있습니다.
문제 상황: 준비한 데이터셋 배열에서 한 샘플과 한 특징 열을 바로 꺼내 봅니다. 입력(input): 3행 2열 features 배열과 features[0, :], features[:, 1] 선택입니다. 기대 출력(output): 첫 번째 샘플 전체와 두 번째 특징 열 전체가 출력됩니다. 확인할 개념: 같은 배열에서도 행 선택과 열 선택은 서로 다른 질문에 대응한다는 점을 봅니다.
첫 번째 코드는 첫 번째 샘플을 꺼냅니다.
두 번째 코드는 모든 샘플의 두 번째 특징을 꺼냅니다.
이 감각은 이후 데이터셋(dataset)을 다룰 때 중요합니다. 모델에 입력할 때는 “어떤 행이 하나의 사례인가”, “어떤 열이 하나의 특징인가”를 먼저 정해야 합니다.
여기서 한 번 더 짧게 다시 묶으면 다음과 같습니다.
| NumPy 배열에서 보는 것 | 데이터셋 언어로 다시 읽을 때 |
|---|---|
| 한 행(row) | 샘플(sample) 한 건 |
| 한 열(column) | 특징(feature) 하나 전체 |
shape[0] | 샘플 수 |
shape[1] | 특징 수 |
이 표를 먼저 붙잡아 두면 뒤의 Pandas와 머신러닝 문서에서 X.shape, sample, feature matrix 같은 표현이 훨씬 덜 낯설어집니다.
아래 도식은 같은 관점을 조금 더 데이터셋에 가깝게 보여 줍니다.
여기서 features[1, :]는 한 샘플의 모든 특징을 꺼내는 코드입니다. 반대로 features[:, 1]는 모든 샘플에서 같은 특징 하나를 꺼내는 코드입니다.
문제 상황: 더 실제적인 데이터셋 모양에서 한 샘플, 한 특징 열, 그 평균을 차례로 확인합니다. 입력(input): 4행 3열 features 배열과 features[1, :], features[:, 1], mean()입니다. 기대 출력(output): 두 번째 샘플, 두 번째 특징 열 전체, 그 평균값이 출력됩니다. 확인할 개념: 행 선택은 사례 하나를, 열 선택은 특징 하나 전체를 뜻하며 이후 통계 계산으로 이어질 수 있다는 점을 봅니다.
출력은 다음과 같습니다.
이 예제에서 마지막 줄은 두 번째 특징의 평균을 계산합니다. 즉 “한 열을 고른다”는 일은 이후 평균, 분산, 정규화, 특징 비교 같은 작업으로 이어질 수 있습니다.
예제 코드 파일¶
이 절의 예제 코드는 다음 파일로도 확인할 수 있습니다.
로컬 PC에서는 프로젝트 루트에서 다음처럼 실행할 수 있습니다.
Colab에서는 파일 내용을 코드 셀에 붙여 넣어 실행할 수 있습니다.
출력에는 1차원 슬라이싱의 start:stop:step 예제와 데이터셋 형태의 행/열 선택 예제도 포함되어 있습니다.
사례 및 예시¶
사례 1. 한 학생 점수만 볼 것인가, 과목 전체를 볼 것인가¶
성적 행렬을 보고 둘째 학생 점수만 보고 싶은지, 수학 점수 열 전체를 보고 싶은지, 지역별 평균처럼 축을 따라 요약하고 싶은지에 따라 읽는 방식이 달라진다고 해 보겠습니다. 사람은 표를 눈으로 훑으며 자연스럽게 이 작업을 하지만, 배열 계산에서는 인덱싱, 슬라이싱, 축을 명시해야 합니다.
data[1, :]는 둘째 학생의 한 행을 고르는 일이고, data[:, 2]는 세 번째 열 전체를 고르는 일입니다. sum(axis=0)은 행 방향을 따라 내려가며 열별 합을 남기고, sum(axis=1)은 각 행 안에서 값을 더해 학생별 합을 남깁니다.
이 사례는 축(axis)이 단순 번호가 아니라 어느 방향으로 읽고 계산할 것인가를 정하는 기준임을 보여 줍니다. 같은 배열이라도 질문이 한 사례를 보려는가, 한 변수 전체를 보려는가, 각 방향의 요약을 보려는가에 따라 코드가 달라집니다.
그래서 인덱싱과 슬라이싱은 단순 문법이 아니라 질문을 배열 위에 올리는 방식으로 읽습니다. 이 감각이 있어야 Pandas의 행·열 선택과 NumPy의 축 계산도 서로 연결됩니다.
특히 Part 3로 넘어갈 때는 다음 한 문장을 바로 말할 수 있어야 합니다.
행(row)은 보통 샘플(sample), 열(column)은 보통 특징(feature)이고, shape는 샘플 수와 특징 수를 함께 보여 준다.
체크리스트¶
- NumPy 인덱스가 0부터 시작한다는 점을 설명할 수 있다.
data[1, 2]를 행과 열 기준으로 읽을 수 있다.data[2, :]와data[:, 3]의 차이를 설명할 수 있다.data[0:2, 1:3]이 어떤 부분 배열을 선택하는지 설명할 수 있다.sum(axis=0)과sum(axis=1)의 결과가 왜 다른지 설명할 수 있다.- 행을 샘플, 열을 특징으로 읽는 데이터셋 관점을 설명할 수 있다.
shape = (4, 3)을 보면샘플 4개, 특징 3개처럼 읽을 수 있다.- 인덱싱은 위치를 고르고, 슬라이싱은 구간을 남기며, 축은 계산 방향을 정한다는 점을 설명할 수 있다.
출처와 참고 자료¶
- NumPy Developers, Indexing on ndarrays, NumPy v2.5 Manual, 확인 날짜: 2026-07-20. 기본 인덱싱, 슬라이싱, 다차원 인덱스, advanced indexing과 copy/view 주의점 확인에 사용했다.
- NumPy Developers, NumPy glossary, NumPy v2.5 Manual, 확인 날짜: 2026-07-20. axis, broadcasting, copy, view 같은 용어를 현재 절의 용어 설명과 맞추는 근거로 사용했다.