สำหรับคำตอบสั้น ๆ คุณควรใช้np.save
และnp.load
. ข้อดีของสิ่งเหล่านี้คือสร้างขึ้นโดยนักพัฒนาของไลบรารี numpy และใช้งานได้แล้ว (บวกมีแนวโน้มที่จะปรับให้เหมาะสมแล้ว) เช่น
import numpy as np
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
np.save(path/'x', x)
np.save(path/'y', y)
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
print(x is x_loaded)
print(x == x_loaded)
คำตอบเพิ่มเติม:
ในท้ายที่สุดมันขึ้นอยู่กับความต้องการของคุณเพราะคุณสามารถบันทึกรูปแบบที่มนุษย์อ่านได้ (ดูที่การถ่ายโอนอาร์เรย์ NumPy ลงในไฟล์ csv ) หรือแม้กระทั่งกับไลบรารีอื่น ๆ หากไฟล์ของคุณมีขนาดใหญ่มาก (ดูวิธีที่ดีที่สุดในการรักษาอาร์เรย์จำนวนนับนี้ บนดิสก์สำหรับการสนทนาแบบขยาย)
อย่างไรก็ตาม (ทำการขยายเนื่องจากคุณใช้คำว่า "อย่างถูกต้อง" ในคำถามของคุณ) ฉันยังคิดว่าการใช้ฟังก์ชัน numpy นอกกรอบ (และโค้ดส่วนใหญ่!) น่าจะตอบสนองความต้องการของผู้ใช้ส่วนใหญ่ เหตุผลที่สำคัญที่สุดคือการที่มันทำงานอยู่แล้ว การพยายามใช้อย่างอื่นด้วยเหตุผลอื่นอาจทำให้คุณต้องพบกับโพรงกระต่ายที่ยาวโดยไม่คาดคิดเพื่อหาสาเหตุว่าทำไมมันถึงไม่ได้ผลและบังคับให้มันทำงาน
ยกตัวอย่างเช่นพยายามบันทึกด้วยของดอง ฉันพยายามเพื่อความสนุกและใช้เวลาอย่างน้อย 30 นาทีในการตระหนักว่าดองจะไม่บันทึกข้อมูลของฉันเว้นแต่ฉันจะเปิดและอ่านไฟล์ในโหมดไบต์ด้วยwb
. ใช้เวลากับ Google ลองทำสิ่งต่างๆทำความเข้าใจกับข้อความแสดงข้อผิดพลาด ฯลฯ ... รายละเอียดเล็ก ๆ น้อย ๆ แต่ความจริงที่ว่าฉันต้องเปิดไฟล์ที่ซับซ้อนด้วยวิธีที่ไม่คาดคิดอยู่แล้ว เพื่อเพิ่มว่าฉันต้องอ่านสิ่งนี้อีกครั้ง (ซึ่ง btw นั้นทำให้สับสน) ความแตกต่างระหว่างโหมด a, a +, w, w + และ r + ในฟังก์ชันเปิดในตัว? .
ดังนั้นหากมีอินเทอร์เฟซที่ตรงกับความต้องการของคุณให้ใช้มันเว้นแต่คุณจะมีเหตุผลที่ดี( มาก ) (เช่นความเข้ากันได้กับ matlab หรือด้วยเหตุผลบางอย่างคุณต้องการอ่านไฟล์และการพิมพ์ใน python จริงๆไม่ตรงกับความต้องการของคุณซึ่ง อาจจะน่าสงสัย) นอกจากนี้ส่วนใหญ่แล้วหากคุณต้องการเพิ่มประสิทธิภาพคุณจะพบในภายหลัง (แทนที่จะใช้เวลานานในการแก้ไขข้อบกพร่องสิ่งที่ไร้ประโยชน์เช่นการเปิดไฟล์ numpy ธรรมดา ๆ )
ดังนั้นการใช้อินเตอร์เฟซ / NumPy ให้ มันอาจจะไม่สมบูรณ์แบบ แต่ก็น่าจะดีโดยเฉพาะอย่างยิ่งสำหรับห้องสมุดที่มีมานานพอ ๆ
ฉันใช้เวลาในการบันทึกและโหลดข้อมูลด้วยจำนวนมากไปแล้วดังนั้นขอให้สนุกกับมันหวังว่ามันจะช่วยได้!
import numpy as np
import pickle
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
pickle.dump(obj={'x':x, 'y':y}, file=db_file)
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
db_pkl = pickle.load(db_file)
print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')
ความคิดเห็นเกี่ยวกับสิ่งที่เรียนรู้:
np.save
ตามที่คาดไว้สิ่งนี้บีบอัดได้ดีอยู่แล้ว (ดูhttps://stackoverflow.com/a/55750128/1601580 ) ใช้งานได้ทันทีโดยไม่ต้องเปิดไฟล์ใด ๆ ทำความสะอาด. ง่าย. มีประสิทธิภาพ ใช้มัน.
np.savez
ใช้รูปแบบที่ไม่มีการบีบอัด (ดูเอกสาร ) Save several arrays into a single file in uncompressed
.npz format.
หากคุณตัดสินใจใช้สิ่งนี้ (คุณได้รับคำเตือนให้หลีกเลี่ยงโซลูชันมาตรฐานดังนั้นคาดว่าจะมีข้อบกพร่อง!) คุณอาจพบว่าคุณต้องใช้ชื่ออาร์กิวเมนต์เพื่อบันทึกเว้นแต่คุณต้องการ ใช้ชื่อเริ่มต้น ดังนั้นอย่าใช้สิ่งนี้หากงานแรกได้ผล (หรืองานใด ๆ ใช้สิ่งนั้น!)
- Pickle ยังอนุญาตให้ใช้รหัสโดยอำเภอใจ บางคนอาจไม่ต้องการใช้สิ่งนี้เพื่อเหตุผลด้านความปลอดภัย
- ไฟล์ที่มนุษย์อ่านได้มีราคาแพงในการทำ ฯลฯ อาจไม่คุ้มค่า
- มีสิ่งที่เรียกว่า
hdf5
ไฟล์ขนาดใหญ่ เย็น! https://stackoverflow.com/a/9619713/1601580
โปรดทราบว่านี่ไม่ใช่คำตอบที่ละเอียดถี่ถ้วน แต่สำหรับแหล่งข้อมูลอื่นให้ตรวจสอบสิ่งนี้: