[9일차-2] 넘파이, 판다스
2026. 6. 5. 09:08ㆍKDT/1. Python
# 넘파이 Numpy
- 파이썬에서 수치 게산과 데이터 분석을 효율적으로 수행하기 위한 라이브러리
- 특히 다차원 배열(Array) 객체를 중심으로 동작
- 대용량 데이터를 빠르고 메모리 효율적 처리 가능
- 벡터 연산, 행렬 계산, 통계 처리, 선형대수, 난수 생성 등 다양한 수학 기능 지원
# 설치
pip install numpy
# 또는
python -m pip install numpy
# ndarray (N-dimensional array)
- Numpy의 핵심 자료구조
- 동일한 자료형을 가지는 데이터를 다차원 형태로 저장하고 빠르게 연산 하도록 만든 배열 객체
- 일반 파이썬 리스트보다 메모리 사용량 적고, 연산 속도 빠름
- 대량의 데이터 효율적 처리 가능
# 리스트를 ndarray로 변환
list1 = [1, 2, 3, 4]
ndarr1 = np.array(list1)
print(ndarr1) # [1 2 3 4]
print(type(ndarr1)) # <class 'numpy.ndarray'>
# ndarray를 리스트로 변환
list2 = ndarr1.tolist()
print(list2) # [1, 2, 3, 4]
print(type(list2)) # <class 'list'>
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]))
# 실수형이 정수형보다 큰 타입이므로 실수형으로 통일
# int형으로 생성
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]))
# 숫자화 시킬 수 있는 문자열이면 에러 발생하지 않음
# 인덱싱과 슬라이싱
- 리스트와 유사하게 인덱싱과 슬라이싱 가능
ndarr1 = np.array(['🍓', '🍉', '🍌', '🍒', '🍑'])
print(ndarr1) # ['🍓' '🍉' '🍌' '🍒' '🍑']
print(ndarr1.shape) # (5, )배열 각 차원의 크기를 tuple형으로 출력
# 인덱싱
print(ndarr1[0])
print(ndarr1[-1])
# 슬라이싱
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) # (3, 4) -> 3행 4열
# 0행 가져오기
print(ndarr2d[0, :])
print(ndarr2d[0,])
print(ndarr2d[0])
# 0열 가져오기
print(ndarr2d[:, 0])
# [1 5 9]
# fancy indexing
# 여러 개 인덱싱
ndarr1 = np.array([10, 15, 2, 8, 20, 90, 85, 44, 23, 32])
idx = [2, 5, 9]
print(ndarr1[idx]) # [2, 5, 9]
ndarr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(ndarr2d[[0, 1], :]) # 0번 1번 행, 모든 열
# [[1 2 3 4]
# [5 6 7 8]]
# logical indexing (= bool indexing)
# 전체 데이터 수와 boolean 수가 같아야 함
ndarr1 = np.array(['🍓', '🍉', '🍌', '🍒', '🍑'])
sel = [True, False, True, True, False]
ndarr1[sel] # array(['🍓', '🍌', '🍒'], dtype='<U1') True에 해당하는 것만 출력
# 데이터 수와 boolean 수 다르면
# IndexError: boolean index did not match indexed array along axis 0; size of axis is 5 but size of corresponding boolean axis is 4
ndarr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
print(ndarr2d > 7) # 7보다 큰 값들에 True 출력
print(ndarr2d[ndarr2d > 7]) # [ 8 9 10 11 12] -> [인덱싱 조건] 에 True에 해당하는 것만 출력⭐
# 행렬 연산
- 선형 대수 :
벡터와 행렬을 사용해 공간과 변환을 다루는 수학
체계적으로 배열한 벡터(리스트 같은)와 행렬(숫자가 격자로 배열된 표)을 이용해 데이터를 표현하고 조작 - 스칼라 (Scalar) :
하나의 숫자로만 이루어진 기본적 데이터 형태
방향이나 구조 없고, 크기만 가짐
ex. 일반적인 정수나 실수값 - 벡터 (Vector) :
여러 개의 숫자가 1차원으로 나열된 구조
크기와 방향을 함께 표현
넘파이에서는 보통 1차원 ndarray 형태로 다룸
ex. [1,2,3]은 3차원 벡터 - 연산
- 행렬의 덧셈
- 행렬의 뺄셈
- 스칼라 곱(숫자곱하기)
- 행렬의 곱셉 : 행과 열을 곱해서 계산. 앞 행렬의 열 개수 = 뒤 행렬의 행 개수여야 가능

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) # ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)
# 행렬 덧셈
print(a + b)
# 행렬 뺄셈
print(a - b)
# 행렬 원소별 곱셈
print(a * b)
# 행렬 나눗셈
print(a / b)
# 수기로 계산
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
# 정렬
- 넘파이의 np.sort() 함수는 배열을 정렬하는데 사용
- 원래 배열을 변경하지 않고 정렬된 배열의 복사본 반환
ndarr1 = np.array([1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
print(np.sort(ndarr1)) # 오름차순 정렬
print(np.sort(ndarr1)[::-1]) # 내림차순 정렬
ndarr2d = np.array([[11, 10, 12, 9],
[3, 1, 4, 2],
[5, 6, 7, 8]])
np.sort(ndarr2d, axis=0) # 각 열을 따로 정렬
# array([[ 3, 1, 4, 2],
# [ 5, 6, 7, 8],
# [11, 10, 12, 9]])
np.sort(ndarr2d, axis=1) # 가로 방향으로 정렬
# array([[ 9, 10, 11, 12],
# [ 1, 2, 3, 4],
# [ 5, 6, 7, 8]])
np.sort(ndarr2d, axis=1)[:, ::-1]
# array([[12, 11, 10, 9],
# [ 4, 3, 2, 1],
# [ 8, 7, 6, 5]])
np.sort(ndarr2d, axis=-1) # 마지막 축은 열. axis=[0, 1]에서 -1은 1
# array([[ 9, 10, 11, 12],
# [ 1, 2, 3, 4],
# [ 5, 6, 7, 8]])
# 판다스 Pandas
- 파이썬에서 데이터를 쉽고 효율적으로 분석하고 처리하기 위해 사용
- 엑셀과 비슷한 형태의 표(Tabular Dat)를 다룸
- Series와 DataFrame이라는 강력한 자료구조 제공
- CSV, Excel, SQL등 다양한 데이터 파일을 불러와 정렬, 필터링, 그룹화, 결측치 처리, 통계 분석 수행
-> 대량의 데이터 빠르게 가공
# 설치
pip install pandas
# 또는
python -m pip install pandas
# import해서 사용하기
import pandas as pd
# 버전 확인하기
pd.__version__
# 시리즈 Series
- 가장 기본적인 1차원 데이터 구조
- 값(Value)과 인덱스(Index)로 구성
- Numpy의 1차원 배열과 비슷하지만, 각 데이터의 이름표 역할인 인덱스가 추가되어 더 체계적인 관리 가능
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
ser1 = pd.Series(data, idx)
print(ser1)
print(ser1.index) # Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='str')
print(ser1.values) # [67 75 90 62 98]
print(type(ser1.values)) # <class 'numpy.ndarray'>
# index와 value의 합으로 이루어진 Series
# index는 index 객체
# values는 ndarray
# Index 객체
- Series와 Dataframe에서 각 데이터의 위치를 식별하고 관리하기 위한 "이름표(Label)"역할의 자료구조
- 일반 리스트처럼 보이지만 단순 데이터 저장용이 아닌, 데이터를 빠르게 검색하고 정렬하며 서로 다른 데이터끼리 매칭 가능하도록 최적화된 객체
# 데이터프레임 DataFrame
- 2차원 테이블 형태
- 구성 : 인덱스(index), 열(column), 값(value)
- index와 column 둘 다 index 객체로 이루어짐
- 공통 인덱스를 가진 모임
- dataframe은 series의 모임
data = [[67, 93, 91],
[75, 68, 96],
[87, 81, 82],
[62, 70, 75],
[98, 56, 87]]
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
# pd.DataFrame(데이터, 인덱스, 컬럼, ...)
pd.DataFrame(data)
pd.DataFrame(data, idx)
pd.DataFrame(data, idx, col)
df = pd.DataFrame(index=idx, columns=col, data=data) # 순서가 헷갈리면 지정해주면 문제 없음
df
print(df.index) # Index(['김사과', '반하나', '오렌지', '이메론', '배애리'], dtype='str')
print(df.columns) # Index(['국어', '영어', '수학'], dtype='str')
print(df.values) # 2차원 배열 형태의 data
# 딕셔너리를 사용하여 데이터프레임을 생성하기
# key는 columns으로
dic = {
'국어':[67, 75, 76, 62, 98],
'영어':[93, 68, 81, 70, 56],
'수학':[91, 96, 82, 75, 87]
}
df = pd.DataFrame(data=dic, index=idx)
df
'KDT > 1. Python' 카테고리의 다른 글
| [10일차] CSV (작성중) (0) | 2026.06.04 |
|---|---|
| [9일차-1] 모듈 (0) | 2026.06.01 |
| [8일차] 객체지향 프로그래밍(다형성), 예외, 매직메서드 (0) | 2026.05.29 |
| [7일차] 사용자정의함수, 객체지향프로그래밍(캡슐화, 상속) (0) | 2026.05.28 |
| [6일차] 제어문(반복문), 사용자 정의 함수(함수 생성, 전역변수, 지역변수) (0) | 2026.05.27 |