Kết xuất mảng NumPy vào tệp csv


545

Có cách nào để kết xuất một mảng NumPy vào một tệp CSV không? Tôi có một mảng NumPy 2D và cần kết xuất nó ở định dạng có thể đọc được.

Câu trả lời:


866

numpy.savetxt lưu một mảng vào một tệp văn bản.

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

2
điều này được ưa thích hơn lặp qua các mảng theo kích thước? Tôi đoán vậy.
Ehtesh Choudhury

51
bạn cũng có thể thay đổi định dạng của mỗi hình bằng từ khóa fmt. mặc định là '% .18e', điều này có thể khó đọc, bạn có thể sử dụng '% .3e' để chỉ hiển thị 3 số thập phân.
Andrea Zonca

3
Andrea, Có, tôi đã sử dụng% 10.5f. Nó khá thuận tiện.
Dexter

12
Phương thức của bạn hoạt động tốt đối với dữ liệu số, nhưng nó gây ra lỗi cho numpy.arraychuỗi. Bạn có thể chỉ định một phương thức để lưu dưới dạng csv cho một numpy.arrayđối tượng có chứa các chuỗi không?
Ébe Isaac

16
@ ÉbeIsaac Bạn cũng có thể chỉ định định dạng dưới dạng chuỗi:fmt='%s'
Luis

136

Bạn có thể sử dụng pandas. Nó cần thêm một số bộ nhớ để không phải lúc nào cũng có thể, nhưng nó rất nhanh và dễ sử dụng.

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

nếu bạn không muốn một tiêu đề hoặc chỉ mục, hãy sử dụng to_csv("/path/to/file.csv", header=None, index=None)


4
Tuy nhiên, điều này cũng sẽ viết một chỉ mục cột trong hàng đầu tiên.
RM-

5
@ RM- bạn có thể sử dụngdf.to_csv("file_path.csv", header=None)
maxbellec

4
Không tốt. Điều này tạo ra một df và tiêu tốn thêm bộ nhớ cho không có gì
Tex

20
hoạt động như bùa mê, rất nhanh - đánh đổi để sử dụng thêm bộ nhớ. tham số header=None, index=Noneloại bỏ hàng tiêu đề và cột chỉ mục.
theastaitsingh

3
@DaveC: Bạn phải đặt commentsđối số từ khóa thành '', #sẽ bị loại bỏ.
Milind R

45

tofile là một chức năng thuận tiện để làm điều này:

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

Trang người đàn ông có một số lưu ý hữu ích:

Đây là một chức năng tiện lợi để lưu trữ nhanh chóng dữ liệu mảng. Thông tin về độ bền và độ chính xác bị mất, vì vậy phương pháp này không phải là lựa chọn tốt cho các tệp nhằm lưu trữ dữ liệu hoặc vận chuyển dữ liệu giữa các máy có độ bền khác nhau. Một số vấn đề này có thể được khắc phục bằng cách xuất dữ liệu dưới dạng tệp văn bản, với chi phí tốc độ và kích thước tệp.

Ghi chú. Hàm này không tạo ra các tệp csv nhiều dòng, nó lưu mọi thứ vào một dòng.


5
Theo như tôi có thể nói, điều này không tạo ra tệp csv, mà đặt mọi thứ trên một dòng duy nhất.
Peter

@Peter, điểm tốt, cảm ơn, tôi đã cập nhật câu trả lời. Đối với tôi, nó không lưu ok ở định dạng csv (mặc dù giới hạn trong một dòng). Ngoài ra, rõ ràng rằng ý định của người hỏi là "bỏ nó ở định dạng có thể đọc được" - vì vậy tôi nghĩ rằng câu trả lời là có liên quan và hữu ích.
Atomh33ls

6
Kể từ phiên bản 1.5.0, np.tofile () lấy tham số tùy chọn newline = '\ n' để cho phép đầu ra nhiều dòng. docs.scipy.org/doc/numpy-1.13.0/reference/generated/ mẹo
Kevin J. Black

2
Trên thực tế, np.savetext () cung cấp đối số dòng mới, không phải np.tofile ()
eaydin

14

Viết mảng bản ghi dưới dạng tệp CSV với các tiêu đề đòi hỏi nhiều công việc hơn một chút.

Ví dụ này đọc một tệp CSV có tiêu đề trên dòng đầu tiên, sau đó ghi cùng một tệp.

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', ',')

Lưu ý rằng ví dụ này không xem xét các chuỗi có dấu phẩy. Để xem xét báo giá cho dữ liệu không phải là số, hãy sử dụng csvgói:

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())

Đây là nơi gấu trúc một lần nữa giúp đỡ. Bạn có thể làm: pd.DataFrame (out, Cột = ['col1', 'col2']), v.v.
EFreak

9

Như đã thảo luận, cách tốt nhất để kết xuất mảng vào tệp CSV là sử dụng .savetxt(...)phương thức. Tuy nhiên, có một số điều chúng ta nên biết để làm điều đó đúng.

Ví dụ, nếu bạn có một mảng NumPy với dtype = np.int32như

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

và muốn lưu bằng cách sử dụng savetxtnhư

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

Nó sẽ lưu trữ dữ liệu ở định dạng hàm mũ theo dấu phẩy động như

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

Bạn sẽ phải thay đổi định dạng bằng cách sử dụng tham số có tên fmt

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

lưu trữ dữ liệu ở định dạng ban đầu

Lưu dữ liệu ở định dạng gz nén

Ngoài ra, savetxtcó thể được sử dụng để lưu trữ dữ liệu ở .gzđịnh dạng nén có thể hữu ích trong khi truyền dữ liệu qua mạng.

Chúng ta chỉ cần thay đổi phần mở rộng của tệp vì .gznumpy sẽ tự động xử lý mọi thứ

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

Hy vọng nó giúp


1
Đó fmt="%d"là những gì tôi đang tìm kiếm. Cảm ơn bạn!
payne

5

Tôi tin rằng bạn cũng có thể thực hiện điều này khá đơn giản như sau:

  1. Chuyển mảng Numpy thành khung dữ liệu Pandas
  2. Lưu dưới dạng CSV

ví dụ # 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

ví dụ # 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

nếu bạn muốn viết vào cột:

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

Ở đây 'a' là tên của mảng numpy và 'file' là biến để ghi trong tệp.

Nếu bạn muốn viết liên tiếp:

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

2

Nếu bạn muốn lưu mảng numpy của mình (ví dụ your_array = np.array([[1,2],[3,4]])) vào một ô, bạn có thể chuyển đổi nó trước bằngyour_array.tolist() .

Sau đó lưu nó theo cách thông thường vào một ô, delimiter=';' và ô trong tệp csv sẽ trông như thế này[[1, 2], [2, 4]]

Sau đó, bạn có thể khôi phục mảng của bạn như thế này: your_array = np.array(ast.literal_eval(cell_string))



2

Bạn cũng có thể làm điều đó với python thuần mà không cần sử dụng bất kỳ mô-đun nào.

# 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
Điều này sử dụng rất nhiều bộ nhớ . Thích lặp trên mỗi hàng và định dạng & viết nó.
lại

@remram nó phụ thuộc vào dữ liệu của bạn, nhưng vâng, nếu nó lớn, nó có thể sử dụng rất nhiều bộ nhớ
Greg

2

Trong Python, chúng tôi sử dụng mô-đun csv.writer () để ghi dữ liệu vào các tệp csv. Mô-đun này tương tự như mô-đun 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()

Một dấu phân cách là một chuỗi được sử dụng để phân tách các trường. Giá trị mặc định là dấu phẩy (,).


Điều này đã được đề xuất: stackoverflow.com/a/41009026/8881141 Vui lòng chỉ thêm các phương pháp mới, không lặp lại các đề xuất được công bố trước đó.
Ông T
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.