มีวิธีการถ่ายโอนข้อมูลอาร์เรย์ NumPy ลงในไฟล์ CSV หรือไม่ ฉันมีอาร์เรย์ NumPy 2D และจำเป็นต้องถ่ายโอนข้อมูลในรูปแบบที่มนุษย์อ่านได้
มีวิธีการถ่ายโอนข้อมูลอาร์เรย์ NumPy ลงในไฟล์ CSV หรือไม่ ฉันมีอาร์เรย์ NumPy 2D และจำเป็นต้องถ่ายโอนข้อมูลในรูปแบบที่มนุษย์อ่านได้
คำตอบ:
numpy.savetxt
บันทึกอาร์เรย์ลงในไฟล์ข้อความ
import numpy
a = numpy.asarray([ [1,2,3], [4,5,6], [7,8,9] ])
numpy.savetxt("foo.csv", a, delimiter=",")
numpy.array
สตริง คุณสามารถกำหนดวิธีการบันทึกเป็น csv สำหรับnumpy.array
วัตถุที่มีสตริงได้หรือไม่?
fmt='%s'
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)
df.to_csv("file_path.csv", header=None)
header=None, index=None
ลบแถวส่วนหัวและคอลัมน์ดัชนี
comments
อาร์กิวเมนต์คำหลักเป็น''
, #
จะถูกระงับ
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 หลายบรรทัด แต่จะบันทึกทุกอย่างไว้ในบรรทัดเดียว
การเขียนเรคคอร์ดอาเรย์เป็นไฟล์ 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())
วิธีที่ดีที่สุดในการดัมพ์อาเรย์ลงในไฟล์ 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=",")
เพื่อจัดเก็บข้อมูลในรูปแบบดั้งเดิม
นอกจากนี้ยังsavetxt
สามารถใช้สำหรับการจัดเก็บข้อมูลใน.gz
รูปแบบการบีบอัดซึ่งอาจเป็นประโยชน์ในขณะถ่ายโอนข้อมูลผ่านเครือข่าย
เราเพียงแค่ต้องเปลี่ยนนามสกุลของไฟล์เป็น.gz
และ numpy จะดูแลทุกอย่างโดยอัตโนมัติ
np.savetxt('values.gz', narr, fmt="%d", delimiter=",")
หวังว่ามันจะช่วย
fmt="%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
เช่น # 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
ถ้าคุณต้องการเขียนในคอลัมน์:
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)
หากคุณต้องการที่จะบันทึกอาร์เรย์ 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))
คุณสามารถทำได้ด้วย 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)
ใน 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()
ตัวคั่นคือสตริงที่ใช้เพื่อแยกฟิลด์ ค่าเริ่มต้นคือเครื่องหมายจุลภาค (,)