배열 속에서 원하는 데이터를 찾는 법

"AI는 모든 데이터를 항상 사용할까?"
만약 학생들의 시험 점수가 저장된 배열이 있다고 가정해 보겠습니다.
85 90 78 96 88
모든 점수를 사용할 수도 있지만, 때로는 첫 번째 학생의 점수만 확인하고 싶을 수도 있습니다.
혹은 마지막 학생의 점수만 보고 싶을 수도 있습니다.
이미지라면 어떨까요?
사진 전체가 아니라 특정 픽셀 하나만 확인하고 싶을 수도 있습니다.
CSV 데이터라면 특정 행만 확인하거나, 특정 열만 가져와야 할 수도 있습니다.
즉, AI에서는 "데이터를 저장하는 것"만큼이나 "원하는 데이터를 정확하게 선택하는 것"이 중요합니다.
NumPy에서는 이러한 작업을 Indexing(인덱싱) 이라고 합니다.
이번 글에서는 Indexing이 무엇인지부터 2차원 배열에서 원하는 행과 열을 선택하는 방법까지 차근차근 알아보겠습니다.
Index란 무엇일까?
먼저 아주 간단한 배열을 하나 만들어 보겠습니다.
import numpy as np
scores = np.array([85, 90, 78, 96, 88])
print(scores)
실행 결과
[85 90 78 96 88]
이 배열에는 다섯 개의 숫자가 들어 있습니다.
하지만 NumPy는 숫자만 저장하는 것이 아니라, 각 숫자의 위치도 함께 관리합니다.
그 위치를 Index(인덱스) 라고 합니다.
그림으로 표현하면 다음과 같습니다.
Index
0 1 2 3 4
│ │ │ │ │
85 90 78 96 88
여기서 가장 많이 실수하는 부분이 있습니다.
Index는 1부터 시작하지 않습니다.
NumPy뿐만 아니라 Python 대부분의 자료구조는 0부터 시작합니다.
첫 번째 데이터 가져오기
Index를 이용하면 원하는 데이터를 쉽게 가져올 수 있습니다.
import numpy as np
scores = np.array([85, 90, 78, 96, 88])
print(scores[0])
실행 결과
85
여기서
scores[0]
의 의미는 "Index가 0인 데이터를 가져와라." 입니다.
첫 번째 데이터이지만 Index는 0입니다.
두 번째와 세 번째 데이터도 가져올 수 있다
같은 방법으로 원하는 위치를 선택할 수 있습니다.
print(scores[1])
print(scores[2])
print(scores[3])
실행 결과
90
78
96
그림으로 보면
Index
0 1 2 3 4
↓
85 90 78 96 88
각 Index가 정확히 하나의 값을 가리킵니다.
존재하지 않는 Index는 어떻게 될까?
이번에는 없는 위치를 선택해 보겠습니다.
print(scores[10])
그러면 다음과 같은 오류가 발생합니다.
IndexError: index 10 is out of bounds for axis 0 with size 5
왜 이런 오류가 발생했을까요?
배열에는
0
1
2
3
4
까지만 존재하기 때문입니다.
존재하지 않는 위치를 선택하면 NumPy는 오류를 발생시켜 잘못된 접근이라는 것을 알려줍니다.
마지막 데이터를 가져오려면?
배열의 마지막 값을 가져오는 방법은 여러 가지가 있습니다.
먼저 Index를 직접 사용하는 방법입니다.
print(scores[4])
실행 결과
88
하지만 여기에는 한 가지 문제가 있습니다.
배열의 길이가 바뀌면 마지막 Index도 함께 바뀝니다.
예를 들어 학생이 한 명 더 추가된다면
85 90 78 96 88 100
마지막 Index는
5
가 됩니다.
매번 마지막 Index를 계산하는 것은 번거롭습니다.
그래서 Python과 NumPy는 더 편리한 방법을 제공합니다.
음수 Index를 사용해 보자
NumPy에서는 뒤에서부터도 접근할 수 있습니다.
print(scores[-1])
실행 결과
88
이번에는
-1
을 사용했습니다.
[-1] 의 의미는
뒤에서 첫 번째 데이터
입니다.
그림으로 표현하면
앞에서
0 1 2 3 4
85 90 78 96 88
-5 -4 -3 -2 -1
뒤에서
즉, 앞에서는
0 → 첫 번째
하지만
뒤에서는
-1 → 마지막
입니다.
뒤에서 두 번째는?
이번에는
print(scores[-2])
실행 결과
96
그림으로 보면
85 90 78 96 88
↑
-2
입니다.
이 기능은 생각보다 자주 사용됩니다.
예를 들어 학습 과정에서 마지막 결과만 확인하거나, 마지막 이미지, 마지막 로그, 마지막 데이터를 가져올 때 매우 편리합니다.
AI에서는 왜 Indexing이 중요할까?
예를 들어 손글씨 숫자 데이터셋(MNIST)을 생각해 보겠습니다.
데이터가
이미지 70,000장
있다고 가정해 보겠습니다.
모든 이미지를 항상 확인하지는 않습니다.
예를 들어 첫 번째 이미지만 보고 싶다면
images[0]
을 사용할 수 있습니다.
열 번째 이미지는
images[9]
마지막 이미지는
images[-1]
입니다.
즉, Indexing은
거대한 데이터셋에서 원하는 데이터 하나를 빠르게 선택하는 기술
이라고 생각하면 됩니다.
2차원 배열도 Index를 사용할 수 있다
지금까지는 한 줄짜리 배열만 사용했습니다.
이번에는 표 형태의 데이터를 만들어 보겠습니다.
import numpy as np
scores = np.array([
[85, 90, 78],
[92, 88, 95],
[76, 81, 89]
])
print(scores)
실행 결과
[[85 90 78]
[92 88 95]
[76 81 89]]
이 배열은 학생 3명, 과목 3개라고 생각하면 이해하기 쉽습니다.
그림으로 표현하면
국어 영어 수학
학생1 85 90 78
학생2 92 88 95
학생3 76 81 89
여기서부터는 행(Row) 과 열(Column) 이라는 개념이 등장합니다.
2차원 배열의 Index는 두 개를 사용한다
2차원 배열에서는
배열[행, 열]
형태를 사용합니다.
예를 들어 첫 번째 학생의 첫 번째 과목 점수는
print(scores[0, 0])
실행 결과
85
입니다.
여기서 첫 번째
0
은 행(Row)
두 번째
0
은 열(Column) 입니다.
scores[0, 0]
첫 번째 행의 첫 번째 열
을 의미합니다.
다른 데이터도 선택해 보자
예를 들어 두 번째 학생의 영어 점수는
print(scores[1, 1])
실행 결과
88
입니다.
세 번째 학생의 수학 점수는
print(scores[2, 2])
실행 결과
89
입니다.
처음에는 행과 열이 헷갈릴 수 있습니다.
이럴 때는 항상
[행, 열]
순서라고 기억하면 됩니다.
행(Row)을 통째로 가져올 수도 있다
2차원 배열에서는 행 전체를 가져오는 경우도 매우 많습니다.
print(scores[0])
실행 결과
[85 90 78]
즉, 첫 번째 학생의 모든 과목 점수를 가져온 것입니다.
반대로
print(scores[1])
은
[92 88 95]
두 번째 학생의 모든 점수를 의미합니다.
이번 글에서 기억해야 할 핵심
이번 글에서는 NumPy에서 원하는 데이터를 선택하는 가장 기본적인 방법인 Indexing을 배웠습니다.
특히 다음 네 가지를 꼭 기억해두는 것이 좋습니다.
- Index는 0부터 시작한다.
- 음수 Index를 사용하면 뒤에서부터 접근할 수 있다.
- 2차원 배열에서는 [행, 열] 순서로 선택한다.
- 행 전체를 가져오는 것도 매우 자주 사용한다.
이 개념은 앞으로 Pandas의 iloc, OpenCV의 이미지 처리, PyTorch Tensor까지 거의 같은 방식으로 사용됩니다.
다음 글 예고
이번 글에서는 원하는 데이터 하나를 선택하는 방법(Indexing)을 배웠습니다.
하지만 실제 데이터 분석에서는 하나의 값보다 여러 개의 데이터를 한 번에 가져오는 경우가 훨씬 많습니다.
예를 들어,
- 첫 번째부터 다섯 번째까지의 데이터
- 앞의 절반만 선택하기
- 일정 간격으로 데이터 가져오기
- 이미지의 일부 영역만 잘라내기
같은 작업을 자주 수행합니다.
다음 글에서는 Slicing(슬라이싱) 을 통해 데이터를 자유롭게 잘라내는 방법을 알아보겠습니다.
'AI Journey > NumPy' 카테고리의 다른 글
| NumPy Broadcasting 완전 정복! Shape가 다른 배열을 계산하는 원리 쉽게 이해하기 (0) | 2026.08.03 |
|---|---|
| NumPy Slicing 완전 정복! 배열에서 원하는 데이터 범위를 자유롭게 선택하는 방법 (0) | 2026.08.02 |
| NumPy dtype이란? int32·float32·float64 차이와 AI에서 자료형이 중요한 이유 (0) | 2026.08.01 |
| NumPy는 왜 빠를까? Vectorization(벡터화)을 가장 쉽게 이해하기 (0) | 2026.08.01 |
| NumPy Array란 무엇일까? List와 가장 큰 차이점, Shape와 차원 쉽게 이해하기 (0) | 2026.07.31 |