넘파이(NumPy)는 Python에서 수치 계산과 데이터 분석을 효율적으로 수행하기 위해 사용하는 대표적인 라이브러리입니다. 특히 다차원 배열(Array) 객체를 중심으로 동작하며, 대용량 데이터를 빠르고 메모리 효율적으로 처리할 수 있도록 설계되어 있습니다. 일반 Python 리스트보다 훨씬 빠른 연산 속도를 제공하며, 벡터 연산, 행렬 계산, 통계 처리, 선형대수, 난수 생성 등 다양한 수학 기능을 지원합니다.
# 설치
pip install numpy
# 또는
python -m pip install numpy
import numpy as np
NumPy의 ndarray(N-dimensional array)는 NumPy의 핵심 자료구조로, 동일한 자료형(dtype)을 가지는 데이터를 다차원 형태로 저장하고 빠르게 연산할 수 있도록 만든 배열 객체입니다. 일반 Python 리스트보다 메모리 사용량이 적고 연산 속도가 매우 빠르며, 벡터 연산과 브로드캐스팅 기능을 통해 반복문 없이도 대량의 데이터를 효율적으로 처리할 수 있습니다.
ndarr1 = np.array([1, 2, 3, 4])
print(ndarr1)
print(type(ndarr1)) # <class 'numpy.ndarray'>
print(type(ndarr1[0])) # <class 'numpy.int64'>
ndarr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(ndarr2)
print(type(ndarr2)) # <class 'numpy.ndarray'>
print(type(ndarr2[0])) # <class 'numpy.ndarray'>
# 리스트를 ndarray로 변환
list1 = [1, 2, 3, 4]
ndarr1 = np.array(list1)
print(ndarr1)
print(type(ndarr1))
# ndarray를 리스트로 변환
list2 = ndarr1.tolist()
print(list2)
print(type(list2))
list1 = [1, 3.14, 'Python', '😊', True]
print(list1)
print(type(list1))
print(type(list1[0]))
print(type(list1[1]))
print(type(list1[2]))
print(type(list1[3]))
print(type(list1[4]))
ndarr1 = np.array([1, 2, 3, 4])
print(ndarr1)
print(type(ndarr1))
print(type(ndarr1[0]))
print(type(ndarr1[1]))
print(type(ndarr1[2]))
print(type(ndarr1[3]))
ndarr2 = np.array([1, 2, 3.14, 4])
print(ndarr2)
print(type(ndarr2))
print(type(ndarr2[0]))
print(type(ndarr2[1]))
print(type(ndarr2[2]))
print(type(ndarr2[3]))
ndarr3 = np.array([1, 2, 3.14, True])
print(ndarr3)
print(type(ndarr3))
print(type(ndarr3[0]))
print(type(ndarr3[1]))
print(type(ndarr3[2]))
print(type(ndarr3[3]))
ndarr4 = np.array(['1', 2, 3.14, True])
print(ndarr4)
print(type(ndarr4))
print(type(ndarr4[0]))
print(type(ndarr4[1]))
print(type(ndarr4[2]))
print(type(ndarr4[3]))
ndarr3 = np.array([1, 2, 3.14, True], dtype=int)
print(ndarr3)
print(type(ndarr3))
print(type(ndarr3[0]))
print(type(ndarr3[1]))
print(type(ndarr3[2]))
print(type(ndarr3[3]))
ndarr4 = np.array(['1', 2, 3.14, True], dtype=int)
print(ndarr4)
print(type(ndarr4))
print(type(ndarr4[0]))
print(type(ndarr4[1]))
print(type(ndarr4[2]))
print(type(ndarr4[3]))
넘파이의 ndarray는 리스트와 유사하게 인덱싱과 슬라이싱을 지원합니다.
ndarr1 = np.array(['🍓', '🍉', '🍌', '🍒', '🍑'])
print(ndarr1)
print(ndarr1.shape)
# 인덱싱
print(ndarr1[0])
print(ndarr1[4])
print(ndarr1[-1])
print(ndarr1[-2])
# 슬라이싱
print(ndarr1[0:3])
print(ndarr1[2:])
print(ndarr1[:3])
# 2차원 배열
ndarr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(ndarr2d)
print(ndarr2d.shape)
# 0행 가져오기
print(ndarr2d[0, :])
print(ndarr2d[0,])
print(ndarr2d[0])
# 0열 가져오기
print(ndarr2d[:, 0])
# fancy indexing
ndarr1 = np.array([10, 15, 2, 8, 20, 90, 85, 44, 23, 32])
idx = [2, 5, 9]
print(ndarr1[idx]) # ndarr1[[2, 5, 9]]
ndarr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(ndarr2d[[0, 1], :])
# logical indexing
ndarr1 = np.array(['🍓', '🍉', '🍌', '🍒', '🍑'])
sel = [True, False, True, True, False]
ndarr1[sel]
# sel = [True, False, True]
# ndarr1[sel]
ndarr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(ndarr2d > 7)
print(ndarr2d[ndarr2d > 7])
넘파이에서는 다차원 배열인 ndarray를 사용하여 행렬 연산을 수행할 수 있습니다. 행렬 연산은 선형 대수와 관련이 깊어, 데이터 과학, 머신러닝, 통계 등 다양한 분야에서 사용됩니다.
선형 대수는 벡터와 행렬을 사용해 공간과 변환을 다루는 수학의 한 분야입니다. 쉽게 말해, 여러 숫자를 체계적으로 배열한 벡터(리스트 같은 것)와 행렬(숫자가 격자로 배열된 표)을 이용해 데이터를 표현하고 조작하는 방법입니다. 선형 대수는 컴퓨터 그래픽스, 머신러닝, 물리학, 공학 등 다양한 분야에서 사용됩니다. 예를 들어, 사진에서 색상을 조정하거나, 로봇이 움직일 경로를 계산하거나, AI가 데이터를 분석하는 데도 선형 대수가 필요합니다.
스칼라는 하나의 숫자만으로 이루어진 가장 기본적인 데이터 형태입니다. 방향(direction)이나 구조(shape)는 없고 오직 크기(magnitude)만 가지며, 일반적인 정수나 실수 값이 모두 스칼라에 해당합니다. 예를 들어 3, -10, 3.14 같은 값들이 스칼라입니다.
벡터는 여러 개의 숫자가 1차원으로 나열된 구조이며, 크기와 방향을 함께 표현하는 데이터입니다. 수학에서는 화살표 개념으로 사용되며, 프로그래밍에서는 1차원 배열 형태로 표현됩니다. 예를 들어 [1, 2, 3] 은 3차원 벡터입니다. NumPy에서는 보통 1차원 ndarray 형태로 다루며, 벡터 간에는 덧셈, 내적(dot product), 크기 계산 등의 연산을 수행할 수 있습니다.
행렬은 숫자를 표 형태로 정리한 것입니다.

같은 크기의 행렬끼리 같은 위치의 숫자를 더합니다.

같은 위치의 값을 서로 뺍니다.

행렬 전체에 숫자를 곱합니다.


a = np.array([[1, 2, 3],
[2, 3, 4]])
b = np.array([[3, 4, 5],
[1, 2, 3]])
print(a.shape, b.shape)
# 행렬 덧셈
print(a + b)
# 행렬 뺄셈
print(a - b)
# 행렬 원소별 곱셈
print(a * b)
# 행렬 나눗셈
print(a / b)
ndarr3 = np.array([[1, 2, 3],
[1, 2, 3],
[2, 3, 4]])
ndarr4 = np.array([[1, 2],
[3, 4],
[5, 6]])
print(ndarr3.shape)
print(ndarr4.shape)
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6))
print(ndarr3 @ ndarr4)
# 행렬 곱셈 또는 벡터 내적을 수행
np.dot(ndarr3, ndarr4)
# 내적: 두 벡터를 곱해서 하나의 숫자(스칼라)를 만드는 연산
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.dot(a, b)) # 1*4+2*5+3*6
NumPy의 np.sort() 함수는 배열을 정렬하는 데 사용됩니다. 이 함수는 기본적으로 원래 배열을 변경하지 않고 정렬된 배열의 복사본을 반환합니다.
ndarr1 = np.array([1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
print(ndarr1)
print(np.sort(ndarr1)) # 오름차순 정렬
print(ndarr1)
print(np.sort(ndarr1)[::-1]) # 내림차순 정렬
ndarr2d = np.array([[11, 10, 12, 9],
[3, 1, 4, 2],
[5, 6, 7, 8]])
print(ndarr2d.shape)
np.sort(ndarr2d, axis=0) # 각 열을 따로 정렬
np.sort(ndarr2d, axis=1) # 가로 방향으로 정렬
np.sort(ndarr2d, axis=1)[:, ::-1]
np.sort(ndarr2d, axis=-1)
arr = np.array([
[
[9, 3, 5],
[8, 1, 7]
],
[
[4, 6, 2],
[10, 0, 11]
]
])
print(arr.shape)
result = np.sort(arr, axis=-1)
print(result)
| 셀레니움 (0) | 2026.06.07 |
|---|---|
| 크롤링을 위한 HTML과 CSS (0) | 2026.06.03 |
| pandas (1) | 2026.05.22 |