Python

파이썬 기초 12편 | 넘파이(Numpy) 기본 문법

SecLogs YJ 2026. 3. 9. 23:39
목차

1. 넘파이(Numpy)란
2. 넘파이 배열 생성
  2-1 기본 배열 생성

  2-2 배열 연산 예시
  2-3 np.zeros()
  2-4 np.ones()
  2-5 np.arange()
  2-6 np.linspace()
3. 배열의 속성 확인
4. 배열의 인덱싱과 슬라이싱
  4-1 1차원 배열

  4-2 2차원 배열
  4-3 슬라이싱
  4-4 2차원 슬라이싱
5. 배열 연산
6. 배열 형태 변경
  6-1 reshape()

  6-2 flatten()
7. 난수 생성
8. 브로드캐스팅
9. 넘파이가 중요한 이유

 

1. 넘파이(Numpy)란

넘파이(Numpy)는 수치 계산을 위한 파이썬 라이브러리이다.

 

특히 다차원 배열 객체인 ndarray로, 빠른 배열 연산과 다양한 수학 연산 기능을 제공한다.

 

넘파이의 주요 특징은 다음과 같다.

  • 고성능 다차원 배열 객체(ndarray) 제공
  • 배열 연산, 선형대수, 난수 생성 등 다양한 수학 함수 제공
  • 머신러닝과 데이터 분석에서 핵심적으로 사용

데이터 분석에서는 보통 다음과 같이 라이브러리를 불러온다.

import numpy as np

 

np 넘파이를 사용할 때 관례적으로 사용하는 별칭이다.

 

넘파이를 사용하려면 먼저 설치가 필요하다.

pip install numpy

 

 

2. 넘파이 배열 생성

넘파이는 배열(ndarray)을 중심으로 동작한다.

 

2-1 기본 배열 생성

 

array() 함수를 사용하여 NumPy의 ndarray 객체를 생성한다.

import numpy as np

arr = np.array([1,2,3,4,5])

print(arr)
print(type(arr))

 

출력 결과

[1 2 3 4 5]
<class 'numpy.ndarray'>

 

넘파일 배열은 리스트와 비슷하지만 대량의 수치 데이터를 다룰 때 연산 속도가 훨씬 빠르다.

 

2-2 배열 연산 예시

넘파이 배열은 배열 전체에 대해 한 번에 연산할 수 있다.

print(arr)
print(arr+10)
print(arr/2)
print(arr-1)
print(arr*2)

 

출력 결과

[1 2 3 4 5]
[11 12 13 14 15]
[0.5 1.  1.5 2.  2.5]
[0 1 2 3 4]
[ 2  4  6  8 10]

 

2-3 np.zeros()

numpy.zeros() 함수는 지정된 모양과 유형의 배열을 0으로 채워 생성한다.

 

zeros = np.zeros((2,3))
print(zeros)

 

출력 결과

[[0. 0. 0.]
 [0. 0. 0.]]

 

즉, (2,3)은 2행 3열을 의미한다.

 

2-4 np.ones()

np.ones() 함수는 지정된 모양과 유형의 새 배열을 반환하며, 모든 요소를 1로 채워 생성한다.

 

ones = np.ones((5,3))
print(ones)

 

출력 결과

[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

 

2-5 np.arange()

np.arange() 함수는 주어진 간격 내에서 등간격 값을 반환한다.

파이썬의 내장 range() 함수와 유사하지만, 리스트 대신 NumPy 배열을 반환한다.

 

seq1 = np.arange(0,12,2)
print(seq1)
print(type(seq1))

 

출력 결과

[ 0  2  4  6  8 10]
<class 'numpy.ndarray'>

 

2-6 np.linspace()

np.linspace() 함수는 지정된 간격에 걸쳐 등간격으로 숫자를 반환한다.

간격 크기를 지정하는 대신 필요한 값의 총 개수를 지정하면 NumPy가 자동으로 간격을 계산한다.

 

linspace = np.linspace(1,10,4)
print(linspace)
print(type(linspace))

 

출력 결과

[ 1.  4.  7. 10.]
<class 'numpy.ndarray'>

 

즉, np.linspace() 와 np.arange() 의 차이는 다음과 같다.

  • np.arange() : 간격(step) 기준
  • np.linspace()  : 개수 기준

 

3. 배열의 속성 확인

배열의 차원, 크기, 데이터 타입 등을 확인할 수 있다.

  • shape : 배열 크기 
  • ndim : 배열 차원 (number of dimensions, 배열의 차원 수)
  • size : 요소 개수
  • dtype : 데이터 타입
list_temp = [
    [1,2,3],
    [4,5,6]
]

arr1 = np.array(list_temp)

print(arr1)
print(arr1.shape)
print(arr1.ndim)
print(arr1.size)
print(arr1.dtype)

 

출력 결과

[[1 2 3]
 [4 5 6]]
(2, 3)
2
6
int64

 

4. 배열의 인덱싱과 슬라이싱

넘파이 배열은 리스트와 동일하게 인덱싱이 가능하다.

 

4-1 1차원 배열

arr = np.array([10,20,30,40])

print(arr[0])
print(arr[1])
print(arr[-1])

 

출력 결과

10
20
40

 

4-2 2차원 배열

arr1 = np.array([
    [1,2,3],
    [4,5,6]
])

print(arr1[0])
print(arr1[0][1])

 

출력 결과

[1 2 3]
2

 

4-3 슬라이싱

arr = np.array([10,20,30,40,50])

print(arr[1:4])

 

출력 결과

[20 30 40]

 

ndarray에서는 인덱스 범위를 넘어가도 에러가 발생하지 않는다.

그 이유는 슬라이싱이 '가능한 범위까지만 잘라서 반환'하는 방식이기 때문이다.

즉, 없는 인덱스를 직접 꺼내지 ㅇ낳고 범위를 잘라내기 때문에, 가능한 부분까지 가져온다.

 

다만, print(arr[10]) 처럼 존재하지 않는 인덱스 하나를 직접 접근하면 에러가 발생한다.

 

4-4 2차원 슬라이싱

arr = np.array([
    [1,2,3],
    [4,5,6],
    [7,8,9]
])

print(arr[:2,1:])

 

출력 결과

[2 3]
 [5 6]]

 

5. 배열 연산

넘파이 배열은 요소별 연산이 가능하다.

arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])

print(arr1 + 10)
print(arr1 + arr2)
print(arr1 * arr2)
print(arr1 ** 2)

 

출력 결과

[11 12 13]
[5 7 9]
[ 4 10 18]
[1 4 9]

 

기본적으로는 같은 위치끼리 계산해야 하므로 shape이 같을 때 가장 자연스럽게 연산된다.
하지만 넘파이는 브로드캐스팅을 지원하기 때문에, 크기가 완전히 같지 않아도 호환 가능한 형태라면 연산이 가능하다.

 

예를 들어, 아래의 경우는 연산이 가능하다. 브로드캐스팅 규칙에 맞으면 연산이 가능하다. 

arr = np.array([1,2,3])
print(arr + 10)

 

 

 

통계 연산 예시

넘파이는 합계, 평균, 최대값, 최솟값 같은 통계 함수도 제공한다.

print(np.sum(arr1))
print(np.mean(arr1))
print(np.max(arr1))
print(np.min(arr1))

 

출력 결과

6
2.0
3
1

 

6. 배열 형태 변경

6-1 reshape()

reshape()는 배열의 데이터를 변경하지 않고 배열의 형태를 바꾼다.

arr = np.array([1,2,3,4,5,6])

reshaped_arr = arr.reshape(2,3)

print(reshaped_arr)

 

출력 결과

[[1 2 3]
 [4 5 6]]

 

단, 전체 요소 개수가 맞아야 가능하다.

예를 들어, 현재 요소는 6개이므로 다음과 같다.

  • reshape(2,3) : 가능 
  • reshape(3,2) : 가능
  • reshape(2,4) : 불가능

 

6-2 flatten()

flatten()는 배열을 1차원으로 축소한 복사본을 반환한다.

flattened_arr = reshaped_arr.flatten()

print(flattened_arr)

 

출력 결과

[1 2 3 4 5 6]

 

7. 난수 생성

넘파이는 난수 배열 생성 기능도 제공한다.

 

예시 1

ran_arr1 = np.random.rand(10)  # 0이ㅣ상 1미만 실수 10개 생성
print(ran_arr1)

 

출력 결과 - 출력 결과는 실행할 때마다 바뀜

[0.22718213 0.74202122 0.81945913 0.22406651 0.75586571 0.83978394
 0.99303429 0.7114143  0.64742182 0.26945572]

 

예시 2

ran_arr2 = np.random.randint(1,10,size=(5,3)) # 1이상 10미만
print(ran_arr2)

 

출력 결과 - 출력 결과는 실행할 때마다 바뀜

[[2 1 8]
 [1 9 3]
 [2 6 1]
 [1 5 4]
 [8 2 1]]


이거 randint(1,10)이면 10 포함하는 건지 아닌지

 

8. 브로드캐스팅

넘파이에서는 배열 크기가 달라도 연산이 가능한 경우가 있다.

이를 브로드캐스팅(Broadcasting)이라고 한다.

 

예시

arr = np.array([1,2,3])

print(arr + 10)

 

출력 결과

[11 12 13]

 

배열의 모든 요소에 10이 자동으로 적용된다.

즉, 넘파이는 작은 형태의 값을 큰 배열에 맞춰 자동으로 확장해서 계산할 수 있다.

9. 넘파이가 중요한 이유

넘파이는 머신러닝과 데이터 분석에서 매우 중요한 라이브러리이다.

 

특히 다음과 같은 작업에 사용된다.

  • 데이터 배열 처리 : AI 모델은 데이터를 벡터나 행렬 형태로 처리
  • 벡터 연산 : AI에서 입력 데이터와 가중치를 곱하기
  • 행렬 연산 : 딥러닝에서는 입력 데이터를 여러 층의 가중치와 곱해 결과를 계산
  • 난수 생성 : AI 학습에서 초기 가중치를 무작위로 설정하며, 데이터셋을 무작위로 섞을 때 난수를 사용 
  • 통계 계산 : 합계, 평균 최댓값, 최솟값 등 기본 통계 처리에 사용,

이러한 기능들은 인공지능 모델 학습 과정에서도 핵심적으로 사용된다.

 


 👉 파이썬 기초 13편 | 판다스(Pandas) 기본 문법