2012-05-10 97 views

回答

19

我認爲這樣做最簡單的方法是先轉換陣列INT16,

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

的[numpy的文檔] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ndarray.tofile.html)陳述「關於字節順序和精度的信息丟失」。這是保證在所有平臺上工作嗎? – Gilly

+3

'tofile'只寫入數組的原始二進制數據,而不是數組的元數據。一個典型的用例是打開一個文件,寫一個適合文件類型的頭文件,並使用'tofile'來填充原始數據。讀取文件的軟件負責從頭中推斷元數據(字節順序,精度,形狀),並將原始數據變爲適合該平臺的格式。沒有元數據,就無法正確解釋數組的原始內容。 如果您只需要讀取和寫入數組,請查看「python hd5」或「numpy.save」。 –

+0

謝謝!即使當我創建指定'np.array([],dtype = np.int8)''的數組時,這個額外的'astype'也是需要的。 –

8

看一看的結構模塊,嘗試這個例子:

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

根據經驗,我強烈建議**反對使用'struct.pack'。它的API需要將數組(即使用'*'運算符)放入變量,這對大數組大小會影響性能**。陣列中的每個元素都需要一個新的即時64位指針(在64位機器上)在堆棧上創建,以指向該元素。只要堅持'tostring' /'tobytes' /'tofile'來避免這種開銷。例如,在我們的例子中,我們正在處理100 Mb陣列,這導致了6.4 Gb的RAM,所以'struct.pack'可以完成它的工作。 –

0

您可能使用scipy.io.savemat它允許將姓名和數組的字典到Matlab風格的文件:

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

這裏pydict可能是= { '名1':np.array1, '名2':np.array2,...}

要加載你只需要字典:

pydict = sio.loadmat(filename)