Đối với một câu trả lời ngắn, bạn nên sử dụng np.save
và np.load
. Ưu điểm của những điều này là chúng được tạo ra bởi các nhà phát triển của thư viện numpy và chúng đã hoạt động (cộng thêm có thể đã được tối ưu hóa độc đáo) ví dụ:
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) # False
print(x == x_loaded) # [[ True True True True True]]
Câu trả lời mở rộng:
Cuối cùng, nó thực sự phụ thuộc vào nhu cầu của bạn vì bạn cũng có thể lưu nó ở định dạng con người có thể đọc được (xem phần này Kết xuất mảng NumPy vào tệp csv ) hoặc thậm chí với các thư viện khác nếu tệp của bạn cực kỳ lớn (xem phần này cách tốt nhất để bảo vệ mảng numpy trên đĩa cho một cuộc thảo luận mở rộng).
Tuy nhiên, (mở rộng vì bạn sử dụng từ "đúng cách" trong câu hỏi của mình) Tôi vẫn nghĩ rằng việc sử dụng hàm numpy out of the box (và hầu hết mã!) Rất có thể sẽ đáp ứng hầu hết các nhu cầu của người dùng. Lý do quan trọng nhất là nó đã hoạt động . Cố gắng sử dụng thứ khác vì bất kỳ lý do nào khác có thể đưa bạn vào một lỗ thỏ DÀI bất ngờ để tìm ra lý do tại sao nó không hoạt động và buộc nó hoạt động.
Lấy ví dụ cố gắng cứu nó bằng dưa chua. Tôi đã thử điều đó chỉ để giải trí và tôi đã mất ít nhất 30 phút để nhận ra rằng dưa chua sẽ không lưu nội dung của tôi trừ khi tôi mở và đọc tệp ở chế độ byte với wb
. Mất thời gian vào google, thử điều gì đó, hiểu thông báo lỗi vv ... Chi tiết nhỏ nhưng thực tế là nó đã yêu cầu tôi mở một tệp phức tạp theo những cách không mong muốn. Để nói thêm rằng nó yêu cầu tôi đọc lại điều này (btw hơi khó hiểu) Sự khác biệt giữa các chế độ a, a +, w, w + và r + trong hàm mở tích hợp sẵn?.
Vì vậy, nếu có một giao diện đáp ứng nhu cầu của bạn, hãy sử dụng nó trừ khi bạn có ( rất ) lý do chính đáng (ví dụ: khả năng tương thích với matlab hoặc vì lý do nào đó bạn thực sự muốn đọc tệp và in bằng python thực sự không đáp ứng được nhu cầu của bạn, điều này có thể nghi vấn). Hơn nữa, rất có thể nếu bạn cần tối ưu hóa nó, bạn sẽ phát hiện ra sau đó (thay vì mất nhiều thời gian để gỡ lỗi những thứ vô dụng như mở một tệp numpy đơn giản).
Vì vậy, hãy sử dụng giao diện / numpy cung cấp . Nó có thể không hoàn hảo nhưng rất có thể nó vẫn ổn, đặc biệt là đối với một thư viện đã tồn tại lâu như vậy.
Tôi đã sử dụng rất nhiều cách để lưu và tải dữ liệu với numpy nên hãy vui vẻ với nó, hy vọng nó sẽ hữu ích!
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
# using save (to npy), savez (to npz)
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)
## using loading npy, npz files
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')
Một số nhận xét về những gì tôi học được:
np.save
như mong đợi, điều này đã nén nó tốt (xem https://stackoverflow.com/a/55750128/1601580 ), hoạt động hiệu quả mà không cần mở tệp nào. Dọn dẹp. Dễ dàng. Có hiệu quả. Sử dụng nó.
np.savez
sử dụng định dạng không nén (xem tài liệu ) Save several arrays into a single file in uncompressed
.npz format.
Nếu bạn quyết định sử dụng định dạng này (bạn đã được cảnh báo là không sử dụng giải pháp tiêu chuẩn vì vậy sẽ có lỗi!), bạn có thể phát hiện ra rằng bạn cần sử dụng tên đối số để lưu nó, trừ khi bạn muốn sử dụng các tên mặc định. Vì vậy, không sử dụng cái này nếu cái đầu tiên đã hoạt động (hoặc bất kỳ tác phẩm nào sử dụng cái đó!)
- Pickle cũng cho phép thực thi mã tùy ý. Một số người có thể không muốn sử dụng nó vì lý do bảo mật.
- Các tệp có thể đọc được của con người rất tốn kém để tạo ra, v.v. Có lẽ không đáng.
- có một cái gì đó được gọi
hdf5
cho các tệp lớn. Mát mẻ! https://stackoverflow.com/a/9619713/1601580
Lưu ý rằng đây không phải là một câu trả lời đầy đủ. Nhưng đối với các tài nguyên khác, hãy kiểm tra điều này: