[Numpy 강좌 – 6] 넘파이(Numpy)를 이용한 파일 입출력

1. 파일 입출력

 

Numpy는 배열 데이터를 파일에 저장하거나 파일에서 로드하는 데 사용할 수 있는 함수를 제공합니다. Numpy는 데이터 저장을 위한 기본적인 2가지 함수를 제공합니다. 이는 np.save, np.load이며, 이들을 사용하여 Numpy 배열을 저장하고 불러올 수 있습니다. 또한, np.savetxt, np.loadtxt, genfromtxt 의 함수를 사용하여 텍스트 파일을 저장하고 불러올 수도 있습니다. 그러나 CSV 파일을 가져오는 방법의 경우 Pandas 패키지를 사용하는 것이 일반적입니다.

 


1.1 numpy.save(), numpy.load()

 

numpy.save()는 Numpy 배열 객체를 .npy 파일로 저장합니다. 파일이 이미 존재하는 경우에는 덮어씁니다.아래 코드에서는 1부터 5까지의 값을 가진 배열을 생성합니다. 그런 다음, np.save를 사용하여 'my_array.npy'라는 이름의 파일로 이 배열을 저장합니다.

 

import numpy as np

# 배열 생성
arr = np.array([1, 2, 3, 4, 5])

# .npy 파일로 저장
np.save('my_array', arr)

 

numpy.load()는 .npy 파일을 읽어와 numpy 배열 객체로 반환합니다. 아래 코드에서는 위에서 저장한 'my_array.npy' 파일을 불러와 출력합니다.

 

# .npy 파일 불러오기
loaded_arr = np.load('my_array.npy')

print(loaded_arr)  # 출력: [1 2 3 4 5]

 


1.2 numpy.savetxt(), numpy.loadtxt()

 

numpy.savetxt()는 1차원과 2차원 배열을 텍스트 파일(.txt or .csv)로 저장합니다. 아래 코드는 2차원의 numpy 배열을 생성한 후, np.savetxt를 사용하여 'my_array.txt'라는 이름의 텍스트 파일로 저장합니다.

 

# 2D 배열 생성
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# .txt 파일로 저장
np.savetxt('my_array.txt', arr_2d)

 

numpy.loadtxt()는 텍스트 파일(.txt or .csv)을 읽어와 numpy 배열로 반환합니다. 아래 코드는 np.loadtxt 함수를 사용하여 위의 코드에서 저장한 'my_array.txt' 파일을 불러와 numpy 배열로 반환합니다.

 

# .txt 파일 불러오기
loaded_arr_2d = np.loadtxt('my_array.txt')

print(loaded_arr_2d)  
# 출력: 
# [[1. 2. 3.]
#  [4. 5. 6.]
#  [7. 8. 9.]]

 


1.3 genfromtext()

 

Numpy의 genfromtxt 함수는 더 많은 옵션을 제공하며, 누락된 값과 같은 복잡한 상황을 처리할 수 있습니다. 아래 코드에서 np.genfromtxt('my_data.csv', delimiter=',') 부분이 CSV 파일을 불러와 numpy 배열로 변환하는 부분입니다. 여기서 delimiter=','는 각 값이 쉼표로 구분되어 있다는 것을 나타냅니다.

 

import numpy as np

# 'my_data.csv' 파일 불러오기
data = np.genfromtxt('my_data.csv', delimiter=',')

# data는 이제 다음과 같은 2차원 numpy 배열입니다:
# [[0.1 0.2 0.3 0.4]
#  [1.1 1.2 1.3 1.4]
#  [2.1 2.2 2.3 2.4]
#  [3.1 3.2 3.3 3.4]
#  [4.1 4.2 4.3 4.4]]

 

numpy.genfromtxt()의 주요 매개변수는 다음과 같습니다.

 

  • fname : 파일, 문자열, 생성기(generator) 또는 파일과 유사한 객체의 이름
  • dtype : 반환할 배열의 데이터 타입. 기본값은 float
  • comments : 주석으로 간주되는 문자 또는 문자열. 해당 문자 뒤의 모든 문자는 라인의 끝까지 무시됩니다. 기본값은 '#'
  • delimiter : 필드 구분자 문자열
  • skip_header : 파일의 시작부터 건너뛸 행 수
  • skip_footer : 파일의 끝부터 건너뛸 행 수
  • missing_values : 결측치를 나타내는 문자열의 리스트
  • filling_values : 결측치를 대체할 값의 리스트
  • usecols : 읽을 열의 순서

 

# 이것은 코멘트입니다.
# 이 행은 무시됩니다.
1, 2, 3
4, 5, Six
7, 8, 9

 

예를 들어, 위와 같이 텍스트 파일('data.txt')이 있다고 가정해보겠습니다. 이 파일에서 데이터를 읽어오는 numpy.genfromtxt() 함수의 사용 예는 아래 코드와 같습니다. 이 코드를 실행하면, 주석이 제거되고, 'Six'라는 문자열이 결측치로 인식되어 -999로 채워진 2차원 배열을 얻게 됩니다.

 

import numpy as np

# 결측치('Six')를 -999로 채우고, ','를 구분자로 사용하여 파일 읽기
data = np.genfromtxt('data.txt', delimiter=',', comments='#', missing_values='Six', filling_values=-999)

print(data)

#출력
#[[  1.   2.   3.]
# [  4.   5. -999.]
# [  7.   8.   9.]]

 

결측치 처리, 열 선택, 주석 처리 등의 기능을 제공하기 때문에, numpy.genfromtxt()는 데이터 분석에 자주 사용됩니다. 다만, numpy.genfromtxt()는 파일을 한 번에 한 줄씩 읽으므로 매우 큰 파일을 읽을 때는 numpy.loadtxt()보다 느릴 수 있습니다. 이런 경우에는 Pandas와 같은 라이브러리를 사용하는 것이 더 효과적일 수 있습니다.