NumPy 배열을 csv 파일로 덤프


545

NumPy 배열을 CSV 파일로 덤프하는 방법이 있습니까? 2D NumPy 배열이 있으며 사람이 읽을 수있는 형식으로 덤프해야합니다.

답변:


866

numpy.savetxt 배열을 텍스트 파일로 저장합니다.

import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")

2
차원별로 배열을 반복하는 것보다 선호됩니까? 나는 그렇게 추측하고있다.
Ehtesh Choudhury

51
fmt 키워드를 사용하여 각 그림의 형식을 변경할 수도 있습니다. 기본값은 '% .18e'이며 읽기가 어려울 수 있습니다. '% .3e'를 사용할 수 있으므로 소수는 3 자리입니다.
Andrea Zonca

3
Andrea, 예 % 10.5f를 사용했습니다. 꽤 편리했습니다.
Dexter

12
이 방법은 숫자 데이터에 적합하지만 numpy.array문자열에 오류가 발생합니다 . numpy.array문자열을 포함 하는 객체에 대해 CSV로 저장하는 방법을 처방 할 수 있습니까?
Ébe Isaac

16
@ ÉbeIsaac 형식을 문자열로 지정할 수도 있습니다.fmt='%s'
Luis

136

사용할 수 있습니다 pandas. 여분의 메모리가 필요하므로 항상 가능하지는 않지만 매우 빠르고 사용하기 쉽습니다.

import pandas as pd 
pd.DataFrame(np_array).to_csv("path/to/file.csv")

머리글이나 색인을 원하지 않으면 to_csv("/path/to/file.csv", header=None, index=None)


4
그러나 이것은 또한 첫 번째 행에 열 색인을 작성합니다.
RM-

5
@ RM- 당신은 사용할 수 있습니다df.to_csv("file_path.csv", header=None)
maxbellec

4
안좋다. 이것은 df를 생성하고 추가 메모리를 전혀 소비하지 않습니다
Tex

20
추가 메모리 사용에 대한 트레이드 오프-매력처럼 작동했습니다. 매개 변수는 header=None, index=None헤더 행과 색인 열을 제거합니다.
thepunitsingh

3
@DaveC : 당신은 설정해야합니다 comments에 키워드 인수 ''#억제됩니다.
Milind R

45

tofile 이 작업을 수행하는 편리한 기능입니다.

import numpy as np
a = np.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
a.tofile('foo.csv',sep=',',format='%10.5f')

매뉴얼 페이지에는 유용한 참고 사항이 있습니다.

이것은 어레이 데이터의 빠른 저장을위한 편리한 기능입니다. 엔디안 및 정밀도에 대한 정보가 손실되므로이 방법은 엔디안이 다른 시스템간에 데이터를 아카이브하거나 데이터를 전송하려는 파일에는 적합하지 않습니다. 이러한 문제 중 일부는 속도와 파일 크기를 희생하면서 데이터를 텍스트 파일로 출력하여 극복 할 수 있습니다.

노트. 이 기능은 여러 줄 csv 파일을 생성하지 않으며 모든 것을 한 줄에 저장합니다.


5
내가 알 수있는 한, 이것은 CSV 파일을 생성하지 않지만 모든 것을 한 줄에 넣습니다.
피터

@ 피터, 좋은 지적, 감사합니다, 나는 대답을 업데이트했습니다. 나를 위해 csv 형식으로 ok를 저장합니다 (한 줄로 제한됨). 또한, asker의 의도는 "사람이 읽을 수있는 형식으로 덤프"하는 것이 분명합니다. 따라서 그 대답은 적절하고 유용하다고 생각합니다.
atomh33ls

6
버전 1.5.0부터 np.tofile ()은 다중 행 출력을 허용하기 위해 선택적 매개 변수 newline = '\ n'을 사용합니다. docs.scipy.org/doc/numpy-1.13.0/reference/generated/…
Kevin J. Black

2
사실, np.savetext는 ())하지 np.tofile (줄 바꿈 인수를 제공합니다
eaydin

14

레코드 배열을 헤더가있는 CSV 파일로 쓰려면 약간 더 많은 작업이 필요합니다.

이 예에서는 첫 번째 줄에 헤더가있는 CSV 파일을 읽은 다음 동일한 파일을 씁니다.

import numpy as np

# Write an example CSV file with headers on first line
with open('example.csv', 'w') as fp:
    fp.write('''\
col1,col2,col3
1,100.1,string1
2,222.2,second string
''')

# Read it as a Numpy record array
ar = np.recfromcsv('example.csv')
print(repr(ar))
# rec.array([(1, 100.1, 'string1'), (2, 222.2, 'second string')], 
#           dtype=[('col1', '<i4'), ('col2', '<f8'), ('col3', 'S13')])

# Write as a CSV file with headers on first line
with open('out.csv', 'w') as fp:
    fp.write(','.join(ar.dtype.names) + '\n')
    np.savetxt(fp, ar, '%s', ',')

이 예에서는 쉼표가있는 문자열을 고려하지 않습니다. 숫자가 아닌 데이터에 대한 따옴표를 고려하려면 csv패키지를 사용하십시오 .

import csv

with open('out2.csv', 'wb') as fp:
    writer = csv.writer(fp, quoting=csv.QUOTE_NONNUMERIC)
    writer.writerow(ar.dtype.names)
    writer.writerows(ar.tolist())

팬더가 다시 도움이되는 곳입니다. pd.DataFrame (out, columns = [ 'col1', 'col2']) 등
EFreak

9

이미 논의했듯이 배열을 CSV 파일로 덤프하는 가장 좋은 방법은 .savetxt(...)방법 을 사용 하는 것입니다. 그러나 올바르게 수행하기 위해 알아야 할 사항이 있습니다.

예를 들어 dtype = np.int32as 가 numpy 배열 인 경우

   narr = np.array([[1,2],
                 [3,4],
                 [5,6]], dtype=np.int32)

및 사용하여 저장할 savetxt

np.savetxt('values.csv', narr, delimiter=",")

부동 소수점 지수 형식으로 데이터를 저장합니다.

1.000000000000000000e+00,2.000000000000000000e+00
3.000000000000000000e+00,4.000000000000000000e+00
5.000000000000000000e+00,6.000000000000000000e+00

fmtas 라는 매개 변수를 사용하여 형식을 변경해야합니다.

np.savetxt('values.csv', narr, fmt="%d", delimiter=",")

데이터를 원래 형식으로 저장

압축 gz 형식으로 데이터 저장

또한 savetxt데이터를 저장하는 데 사용할 수 있습니다.gz 네트워크를 통해 데이터를 전송할 때 유용 할 수 압축 형식으로 .

.gznumpy는 모든 것을 자동으로 처리 하므로 파일의 확장자를 변경하면 됩니다.

np.savetxt('values.gz', narr, fmt="%d", delimiter=",")

그것이 도움이되기를 바랍니다.


1
fmt="%d"내가 찾던이었다. 감사합니다!
payne

5

다음과 같이 간단하게 수행 할 수 있다고 생각합니다.

  1. Numpy 배열을 Pandas 데이터 프레임으로 변환
  2. CSV로 저장

예 : # 1 :

    # Libraries to import
    import pandas as pd
    import nump as np

    #N x N numpy array (dimensions dont matter)
    corr_mat    #your numpy array
    my_df = pd.DataFrame(corr_mat)  #converting it to a pandas dataframe

예 : # 2 :

    #save as csv 
    my_df.to_csv('foo.csv', index=False)   # "foo" is the name you want to give
                                           # to csv file. Make sure to add ".csv"
                                           # after whatever name like in the code

4

열에 쓰려면 :

    for x in np.nditer(a.T, order='C'): 
            file.write(str(x))
            file.write("\n")

여기서 'a'는 numpy 배열의 이름이고 'file'은 파일에 쓸 변수입니다.

행에 쓰려면 :

    writer= csv.writer(file, delimiter=',')
    for x in np.nditer(a.T, order='C'): 
            row.append(str(x))
    writer.writerow(row)

2

numpy 배열 (예 :) your_array = np.array([[1,2],[3,4]])을 하나의 셀 에 저장하려면 먼저로 변환하십시오 your_array.tolist().

그런 다음 일반적인 방법으로 하나 delimiter=';' 의 셀에 저장하면 csv 파일의 셀은 다음과 같습니다.[[1, 2], [2, 4]]

그런 다음 다음과 같이 배열을 복원 할 수 있습니다. your_array = np.array(ast.literal_eval(cell_string))


글쎄 그것은 문자 그대로 numpy 배열을 사용하여 모든 메모리 절약을 파괴 할 것입니다
PirateApp

2

모듈을 사용하지 않고 순수한 파이썬으로 할 수도 있습니다.

# format as a block of csv text to do whatever you want
csv_rows = ["{},{}".format(i, j) for i, j in array]
csv_text = "\n".join(csv_rows)

# write it to a file
with open('file.csv', 'w') as f:
    f.write(csv_text)

1
이것은 많은 메모리를 사용 합니다 . 각 행을 반복하여 서식을 지정하고 작성하십시오.
remram

@remram 그것은 당신의 데이터에 의존하지만, 그렇다면 큰 메모리를 사용할 수 있습니다
Greg

2

파이썬에서는 csv.writer () 모듈을 사용하여 csv 파일에 데이터를 씁니다. 이 모듈은 csv.reader () 모듈과 유사합니다.

import csv

person = [['SN', 'Person', 'DOB'],
['1', 'John', '18/1/1997'],
['2', 'Marie','19/2/1998'],
['3', 'Simon','20/3/1999'],
['4', 'Erik', '21/4/2000'],
['5', 'Ana', '22/5/2001']]

csv.register_dialect('myDialect',
delimiter = '|',
quoting=csv.QUOTE_NONE,
skipinitialspace=True)

with open('dob.csv', 'w') as f:
    writer = csv.writer(f, dialect='myDialect')
    for row in person:
       writer.writerow(row)

f.close()

구분자는 필드를 구분하는 데 사용되는 문자열입니다. 기본값은 쉼표 (,)입니다.


이것은 이미 제안되었습니다 : stackoverflow.com/a/41009026/8881141 새로운 접근 방식 만 추가하십시오. 이전에 발표 된 제안은 반복하지 마십시오.
Mr. T
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.