ดัมพ์อาร์เรย์ NumPy ลงในไฟล์ csv


545

มีวิธีการถ่ายโอนข้อมูลอาร์เรย์ NumPy ลงในไฟล์ CSV หรือไม่ ฉันมีอาร์เรย์ NumPy 2D และจำเป็นต้องถ่ายโอนข้อมูลในรูปแบบที่มนุษย์อ่านได้

คำตอบ:


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
อันเดรียใช่ฉันใช้% 10.5f มันค่อนข้างสะดวก
เด็กซ์เตอร์

12
วิธีการของคุณทำงานได้ดีกับข้อมูลตัวเลข แต่มีข้อผิดพลาดเกิดขึ้นกับnumpy.arrayสตริง คุณสามารถกำหนดวิธีการบันทึกเป็น csv สำหรับnumpy.arrayวัตถุที่มีสตริงได้หรือไม่?
Ébe Isaac

16
@ ÉbeIsaacคุณสามารถระบุรูปแบบเป็นสตริงเช่นกัน:fmt='%s'
หลุยส์

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

man page มีหมายเหตุที่เป็นประโยชน์:

นี่คือฟังก์ชั่นอำนวยความสะดวกสำหรับการจัดเก็บข้อมูลอาเรย์อย่างรวดเร็ว ข้อมูลเกี่ยวกับ endianness และความแม่นยำหายไปดังนั้นวิธีนี้จึงไม่ใช่ตัวเลือกที่ดีสำหรับไฟล์ที่ต้องการเก็บข้อมูลหรือส่งข้อมูลระหว่างเครื่องที่มีความแตกต่างกัน ปัญหาเหล่านี้บางอย่างสามารถแก้ไขได้ด้วยการแสดงผลข้อมูลเป็นไฟล์ข้อความโดยเสียค่าใช้จ่ายในเรื่องความเร็วและขนาดไฟล์

บันทึก. ฟังก์ชั่นนี้ไม่ได้สร้างไฟล์ csv หลายบรรทัด แต่จะบันทึกทุกอย่างไว้ในบรรทัดเดียว


5
เท่าที่ฉันสามารถบอกได้สิ่งนี้ไม่ได้สร้างไฟล์ csv แต่ใส่ทุกอย่างไว้ในบรรทัดเดียว
ปีเตอร์

@ ปีเตอร์จุดดีขอบคุณฉันได้อัปเดตคำตอบแล้ว สำหรับฉันมันจะบันทึกตกลงในรูปแบบ csv (แม้ว่าจะ จำกัด อยู่ที่หนึ่งบรรทัด) นอกจากนี้ยังเป็นที่ชัดเจนว่าเจตนาของผู้ถามคือ "ทิ้งในรูปแบบที่มนุษย์อ่านได้" - ดังนั้นฉันคิดว่าคำตอบนั้นมีความเกี่ยวข้องและมีประโยชน์
atomh33ls

6
ตั้งแต่เวอร์ชัน 1.5.0, np.tofile () รับพารามิเตอร์ตัวเลือกขึ้นบรรทัดใหม่ = '\ 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 (ออก, คอลัมน์ = ['col1', 'col2']), ฯลฯ
EFreak

9

วิธีที่ดีที่สุดในการดัมพ์อาเรย์ลงในไฟล์ CSV คือการใช้.savetxt(...)วิธีการ อย่างไรก็ตามมีบางสิ่งที่เราควรรู้ที่จะทำอย่างถูกต้อง

ตัวอย่างเช่นถ้าคุณมีอาร์เรย์ที่มีค่าdtype = np.int32เป็น

   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

คุณจะต้องเปลี่ยนรูปแบบโดยใช้พารามิเตอร์ที่เรียกว่าfmtเป็น

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

เพื่อจัดเก็บข้อมูลในรูปแบบดั้งเดิม

บันทึกข้อมูลในรูปแบบบีบอัด gz

นอกจากนี้ยังsavetxtสามารถใช้สำหรับการจัดเก็บข้อมูลใน.gzรูปแบบการบีบอัดซึ่งอาจเป็นประโยชน์ในขณะถ่ายโอนข้อมูลผ่านเครือข่าย

เราเพียงแค่ต้องเปลี่ยนนามสกุลของไฟล์เป็น.gzและ numpy จะดูแลทุกอย่างโดยอัตโนมัติ

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

หวังว่ามันจะช่วย


1
นั่นfmt="%d"คือสิ่งที่ฉันกำลังมองหา ขอบคุณ!
เพน

5

ฉันเชื่อว่าคุณสามารถทำสิ่งนี้ได้อย่างง่าย

  1. แปลง Numpy Array เป็น Pandas Data
  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 array และ '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

คุณสามารถทำได้ด้วย python แท้โดยไม่ต้องใช้โมดูลใด ๆ

# 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 มันขึ้นอยู่กับข้อมูลของคุณ แต่ใช่ว่ามันมีขนาดใหญ่ก็สามารถใช้หน่วยความจำมาก
เกร็ก

2

ใน Python เราใช้โมดูล 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โปรดเพิ่มวิธีการใหม่เท่านั้นอย่าทำซ้ำคำแนะนำที่เผยแพร่ก่อนหน้านี้
นาย T
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.