Week 4 (file IO / NumPy 01 - 기초 배열(array) 이해)
- 목표
- 파일을 활용해 데이터 input/output의 활용 가능하다.
- NumPy 기초를 이해한다.
수업 04-1 기초 (file/IO)
- 개념
- Python에서 파일을 다룰 때는
open()
함수 - 파일 모드
- 모드
- ‘r’ : read
- ‘w’ : write
‘a’ : append‘b’ : binary’+’ : read & write
- 모드
- 예시 (텍스트 파일 쓰기)
# 파일 쓰기 with open("example.txt", "w" encoding="utf-8") as f: f.write("안녕하세요!\n") f.write("파일 I/O 예제입니다.\n")
- 예시 (텍스트 파일 읽기)
# 파일 읽기 with open("example.txt", "r", encoding="utf-8") as f: lines = f.readlines() # 모든 줄을 리스트로 읽기 for line in lines: print(line.strip()) # strip() → 줄바꿈 제거
-
예시 (성적 처리)
다음 파일을 읽고 평균, 표준 편차, 그리고 최고점과 최저점을 받은 학생 번호를 찾는 파이썬 프로그램을 만들어 보자.
- 예시 (모든 파일의 이름 바꾸기)
다음 압축파일을 풀어서 살펴보자.
여기서 파일 이름에서 ‘WZ’를 모두 ‘EX’로 바꾸고 싶다. 어떻게 해야할까?
c:\users\user> ren 00_DD_WZ_01.csv 00_DD_EX_01.csv c:\users\user> ren 00_DD_WZ_02.csv 00_DD_EX_02.csv ...
혹은 복사?
c:\users\user> ren 00_DD_WZ_01.csv 00_DD_EX_01.csv c:\users\user> ren 00_DD_WZ_02.csv 00_DD_EX_02.csv ...
혹은 마우스로 일일이 눌러서 바꿀 수도 있겠다.
하지만 Python으로 가능할까?
# os.copy # glob # os.getcwd() # os.listdir(os.getcwd()) # `str`의 split을 찾거나, 혹은 index를 활용해 바꿀 수도 있겠다.
수업 04-2
- Python에서 파일을 다룰 때는
- 개념
- Numpy는 고성능 수치 계산을 위한 library
- 설치 (인터넷 연결 필요)
pip install numpy
- import
import numpy as np
- 배열 생성
# 1차원 배열 arr1 = np.array([1, 2, 3]) print(arr1) # 2차원 배열 arr2 = np.array([[1, 2, 3], [4, 5, 6]]) print(arr2) # 0으로 채운 배열 zeros_arr = np.zeros((2, 3)) # 2행 3열 print(zeros_arr) # 1로 채운 배열 ones_arr = np.ones((3, 3)) print(ones_arr) # 특정 값으로 채운 배열 full_arr = np.full((2, 2), 7) print(full_arr) # 연속된 수 range_arr = np.arange(0, 10, 2) # 0부터 10 전까지 2씩 증가 print(range_arr) # 랜덤 배열 rand_arr = np.random.rand(2, 3) # 0~1 사이 난수 print(rand_arr)
- 배열 속성
arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr.shape) # (2, 3) → 2행 3열 print(arr.ndim) # 차원 수 → 2 print(arr.size) # 전체 원소 개수 → 6 print(arr.dtype) # 데이터 타입 → int64 (환경에 따라 다름)
- 배열 연산
- Vectorized operation (속도 향상)
- 반복문 필요 없음.
- element-wise operation 이라도 불림 ```python a = np.array([1, 2, 3]) b = np.array([4, 5, 6])
print(a + b) # [5 7 9] print(a - b) # [-3 -3 -3] print(a * b) # [ 4 10 18] (요소별 곱) print(a / b) # [0.25 0.4 0.5] print(a ** 2) # [1 4 9] (제곱) ```
- Indexing & slicing
arr = np.array([[1, 2, 3], [4, 5, 6]]) # nested 배열의 각 축을 '행'(가로)과 '열'(세로)이라 하면 # arr = [ 1 2 3 ] # 첫번째 가로 #. 4 5 6 # 두번째 가로 print(arr[0, 0]) # 1행 1열 → 1 print(arr[1, :]) # 2행 전체 → [4 5 6] print(arr[:, 1]) # 모든 행의 2열 → [2 5]
- 예제: 데이터 파일
Use data in here matrix_01.txt
import numpy as np # 공백 구분 텍스트 불러오기 matrix = np.loadtxt("matrix.txt") print("불러온 행렬:") print(matrix) print("shape:", matrix.shape) # (3, 3) print("dtype:", matrix.dtype) # ?
- 예제: csv file
Use data in here matrix_01.csv
import numpy as np # 공백 구분 텍스트 불러오기 matrix = np.loadtxt("matrix.txt") print("불러온 행렬:") print(matrix) print("shape:", matrix.shape) # (3, 3) print("dtype:", matrix.dtype) # ?
- 예제: 저장하기
# 행렬 저장하기 (공백 구분) matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) np.savetxt("save_matrix.txt", matrix, fmt="%.2f") # CSV로 저장 np.savetxt("save_matrix.csv", matrix, delimiter=",", fmt="%d")