이 모듈의 도달 목표

NumPy 배열과 shape

여러 숫자를 ndarray로 바꾸고 차원·shape·dtype를 확인해 모델이 받을 수 있는 일정한 형태로 정리합니다.

결과물 · 모델 입력 배열 검사기
약 4~6시간
  • 리스트와 ndarray의 차이를 설명하고 배열을 생성한다
  • ndim·shape·size·dtype가 나타내는 정보를 구분한다
  • 2차원 배열의 행·열을 인덱싱하고 슬라이싱한다
  • 전체 원소 수를 유지하며 모델 입력 형태로 reshape한다
01

ndarray는 같은 종류의 숫자를 담는 계산용 표

NumPy의 ndarray는 많은 숫자를 일정한 차원과 자료형으로 묶습니다. Python 리스트보다 숫자 계산 규칙이 분명하고 AI 모델이 받는 데이터 모양을 직접 표현하기 좋습니다.

일상에서 보면크기와 칸이 제각각인 메모 묶음을 행과 열이 맞는 스프레드시트로 옮기는 것과 같습니다.
import numpy as np
values = np.array([10, 20, 30])
print(values)
print(type(values))
실행 결과
[10 20 30]
<class 'numpy.ndarray'>
한 줄씩 보기
  1. NumPy를 짧은 이름 np로 불러옵니다.
  2. 세 정수로 ndarray를 만듭니다.
  3. 배열 값과 자료형을 확인합니다.
직접 값 바꾸기목록에 40을 추가하고 배열의 size가 어떻게 바뀌는지 확인하세요.
흔한 실수np.array가 아니라 np.ndarray를 직접 호출해 값을 만들려고 하면 의도와 다른 빈 배열 생성 규칙을 만나기 쉽습니다.

짧은 확인Python 숫자 목록을 NumPy 배열로 바꾸는 함수는 무엇일까요?

02

ndim, shape, size는 서로 다른 모양 정보

ndim은 축의 개수, shape는 각 축의 길이, size는 전체 원소 수입니다. shape가 (3, 2)이면 3개 샘플이 각각 2개 특성을 가진 2차원 배열로 읽을 수 있습니다.

일상에서 보면책장의 층 수, 각 층의 칸 수, 전체 책 수를 서로 따로 세는 것과 같습니다.
import numpy as np
data = np.array([[1, 2], [3, 4], [5, 6]])
print(data.ndim)
print(data.shape)
print(data.size)
실행 결과
2
(3, 2)
6
한 줄씩 보기
  1. 3행 2열 배열을 만듭니다.
  2. 행과 열 두 축이 있어 ndim은 2입니다.
  3. shape는 3행 2열입니다.
  4. 전체 값은 6개입니다.
직접 값 바꾸기행을 하나 더 추가했을 때 shape와 size를 예상해 보세요.
흔한 실수shape의 첫 숫자는 열 수가 아니라 보통 행 또는 샘플 수입니다.

짧은 확인shape (4, 3)인 배열의 ndim과 size는 각각 얼마일까요?

03

dtype은 배열 값의 공통 숫자 규격

ndarray는 원소를 공통 dtype으로 저장합니다. int64는 정수, float64는 실수 규격입니다. 모델 입력은 소수 계산이 필요해 float 배열로 바꾸는 경우가 많습니다.

일상에서 보면한 표의 모든 길이를 cm 또는 m 중 하나의 단위로 맞추는 것과 같습니다.
import numpy as np
integers = np.array([1, 2, 3])
floats = integers.astype(np.float64)
print(integers.dtype.name)
print(floats.dtype.name)
print(floats.tolist())
실행 결과
int64
float64
[1.0, 2.0, 3.0]
한 줄씩 보기
  1. 정수 배열을 만듭니다.
  2. astype으로 실수 규격의 새 배열을 만듭니다.
  3. 두 dtype과 변환된 값을 확인합니다.
직접 값 바꾸기처음부터 np.array([1, 2, 3], dtype=np.float64)로 만들어 보세요.
흔한 실수문자열이 섞이면 숫자 계산용 dtype이 아닌 문자열 dtype으로 바뀔 수 있습니다.

짧은 확인정수 배열을 float64로 변환하는 메서드는 무엇일까요?

04

쉼표로 축마다 위치를 선택한다

2차원 배열은 array[행, 열] 순서로 접근합니다. 콜론은 해당 축의 모든 위치를 뜻하므로 array[1, :]은 두 번째 행, array[:, 0]은 첫 번째 열입니다.

일상에서 보면좌석표에서 몇 번째 줄의 몇 번째 좌석인지 행과 열 번호로 찾는 것과 같습니다.
import numpy as np
data = np.array([[10, 20, 30], [40, 50, 60]])
print(data[1, 2])
print(data[0, :].tolist())
print(data[:, 1].tolist())
실행 결과
60
[10, 20, 30]
[20, 50]
한 줄씩 보기
  1. 2행 3열 배열을 만듭니다.
  2. 1번 행 2번 열 값을 고릅니다.
  3. 0번 행의 모든 열을 고릅니다.
  4. 모든 행의 1번 열을 고릅니다.
직접 값 바꾸기마지막 열을 array[:, -1]로 선택해 보세요.
흔한 실수인덱스는 1이 아니라 0부터 시작하므로 첫 행은 0번입니다.

짧은 확인모든 행에서 첫 번째 열을 선택하는 표현은 무엇일까요?

05

reshape는 값은 유지하고 배치 모양을 바꾼다

reshape는 원소 순서를 유지하면서 shape만 바꿉니다. 바꾸기 전후의 전체 원소 수가 같아야 하며, 6개 값을 (2, 3)이나 (3, 2)로 만들 수 있지만 (2, 2)로는 만들 수 없습니다.

일상에서 보면같은 6개의 달걀을 2×3 상자나 3×2 상자에 다시 담되 달걀 수는 바뀌지 않는 것과 같습니다.
import numpy as np
values = np.array([1, 2, 3, 4, 5, 6])
table = values.reshape(2, 3)
print(table.shape)
print(table.tolist())
실행 결과
(2, 3)
[[1, 2, 3], [4, 5, 6]]
한 줄씩 보기
  1. 6개 값의 1차원 배열을 만듭니다.
  2. 2행 3열로 모양을 바꿉니다.
  3. 새 shape와 중첩 목록 형태를 확인합니다.
직접 값 바꾸기reshape(3, 2)의 결과에서 첫 행이 어떻게 달라지는지 확인하세요.
흔한 실수원소 수와 맞지 않는 shape를 요청하면 ValueError가 발생합니다.

짧은 확인8개 값을 2행으로 만들 때 열 수는 몇이어야 할까요?

표를 2차원 배열로 만들기

  1. 필요한 전체 값의 개수를 행×열로 계산합니다.
  2. 1차원 ndarray를 생성합니다.
  3. 원소 수를 유지하며 2차원으로 바꿉니다.
  4. 한 행인 경계 사례도 2차원인지 확인합니다.
import numpy as np

rows, cols = map(int, input().split())
values = list(map(int, input().split()))
array = np.array(values).reshape(rows, cols)
print(f'shape: {array.shape}')
print(f'차원: {array.ndim}')
print(f'값: {array.tolist()}')

핵심을 확인해 볼까요?

5문항 중 4문항 이상 정답이면 완료됩니다. 오답 후에도 다시 제출할 수 있습니다.

1shape가 (5, 3)인 모델 입력 배열의 일반적인 의미는?
2shape (2, 4) 배열의 size는?
3모든 행의 두 번째 열을 선택하는 표현은?
46개 원소를 reshape할 수 없는 shape는?
5각 특성 열의 평균을 계산하는 표현은?