2012-05-10 25 views
8

Tôi muốn lưu nội dung của mảng phao vào một tệp nhị phân thô dưới dạng số nguyên 16 bit đã ký. Tôi đã cố gắng thực hiện điều này bằng cách sử dụng ndarray.tofile nhưng tôi không thể tìm ra chuỗi định dạng phù hợp. Dường như tệp được lưu ở định dạng kép, mo vấn đề cách tôi chọn chuỗi định dạng. Làm thế nào để tôi làm điều này? Cảm ơn.Viết một tệp nhị phân thô với dữ liệu mảng NumPy

Trả lời

19

Tôi nghĩ rằng cách dễ nhất để làm điều này là lần đầu tiên chuyển đổi mảng để int16,

array.astype('int16').tofile(filename) 
+1

Các [NumPy tài liệu] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ndarray.tofile.html) nêu rõ "Thông tin về độ chính xác và độ chính xác bị mất". Người bảo vệ này có hoạt động trên tất cả các nền tảng không? – Gilly

+3

'tofile' chỉ ghi dữ liệu nhị phân thô của mảng, chứ không phải siêu dữ liệu của mảng. Một trường hợp sử dụng điển hình là mở một tệp, viết tiêu đề thích hợp cho loại tệp và sử dụng 'tofile' để điền vào dữ liệu thô. Đó là trách nhiệm của phần mềm đọc tệp để phỏng đoán siêu dữ liệu (độ chính xác, độ chính xác, hình dạng) từ đầu trang và biến đổi dữ liệu thô thành một biểu mẫu thích hợp cho nền tảng đó. Không có siêu dữ liệu, không có cách nào để diễn giải chính xác nội dung thô của mảng. Nếu tất cả những gì bạn cần là đọc và viết mảng, hãy xem "python hd5" hoặc 'numpy.save'. –

+0

Cảm ơn bạn! Cần thêm 'astype' này ngay cả khi tôi tạo mảng chỉ định' np.array ([], dtype = np.int8) '. –

8

Hãy nhìn vào các mô-đun struct, hãy thử ví dụ này:

import struct 
import numpy 

f=open("myfile","wb") 
mydata=numpy.random.random(10) 
print(mydata) 
myfmt='f'*len(mydata) 
# You can use 'd' for double and <or> to force endinness 
bin=struct.pack(myfmt,*mydata) 
print(bin) 
f.write(bin) 
f.close() 
+10

Dựa trên kinh nghiệm, tôi khuyên bạn nên ** chống lại ** việc sử dụng 'struct.pack'. API của nó yêu cầu bạn phải loại bỏ mảng (ví dụ: sử dụng toán tử '*') thành các biến sẽ ảnh hưởng đến hiệu suất ** đáng kể ** đối với các kích thước mảng lớn. Mỗi phần tử của mảng sẽ cần một con trỏ 64 bit mới (trên máy 64 bit) được tạo trên ngăn xếp để trỏ vào phần tử đó. Chỉ cần dính vào 'tostring' /' tobytes'/'tofile' để tránh chi phí này. Ví dụ, trong trường hợp của chúng ta, chúng ta đã xử lý các mảng 100 Mb dẫn đến một con số khổng lồ 6.4 Gb RAM để 'struct.pack' có thể thực hiện công việc của nó. –

0

Bạn có thể sử dụng scipy.io.savemat cho phép lưu từ điển tên và mảng vào tệp kiểu Matlab:

import scipy.io as sio 
sio.savemat(filename, pydict) 

Đây pydict có thể = { 'name1': np.array1, 'name2': np.array2, ...}

Để tải dict bạn chỉ cần:

pydict = sio.loadmat(filename) 
Các vấn đề liên quan