2013-04-01 42 views
0

什麼我基本上是試圖做的是轉換一些MATLAB代碼到Python:MATLAB到Python FREAD

的MATLAB代碼:

for time = 100:model_times 
     for i = 1:5 
      indat = fread(fid,[48,40],'real*4'); 
      vort(:,:,i,time) = indat'; 
     end 
    end 

FID保存文件路徑(DAT文件)是被用過的。 vort是預先分配的:vort =零(40,48,5,model_times)。 model_times是固定整數(例如100)。

似乎正在發生的事情是.dat文件數據正在以48x40矩陣的形式讀入,然後在固定的i和時間(循環計數器)中插入預分配的數組vort中。

我已經在Python嘗試這樣的:

for time in range(model_times): 
     for i in range(5): 
      vort[:,:,i,time] = np.fromfile(fid,np.float64) 

我收到一個錯誤,指出, 「ValueError異常:操作數不能連同形狀(40,48)(6048000)播出」。錯誤發生在上面的Python代碼的最後一行。我也嘗試向錯誤行添加.reshape((40,48,5,model_times)),但接收到另一個錯誤,指出「ValueError:新數組的總大小必須保持不變」。

所以我的問題是,什麼是相當於MATLAB的「fread」,可以處理多維數組的Python?

從1到10的等級,其中1爲一個總的初學者和10是一個經驗豐富的老將,我約4

回答

0

我假設你是從一個二進制閱讀48種* 40個元素文件在每次迭代中,每個元素的大小爲8個字節。您的代碼正在破譯,因爲默認情況下,np.fromfile會讀取每個元素。修復此問題

vort = np.zeros((48,40,5,model_times)) 
for time in xrange(model_times): 
    for i in xrange(5): 
    dat = np.fromfile(fid, dtype=np.float64,count = 48*40) 
    vort(:,:,i,time) = dat.reshape((48,40)) 
+0

http://docs.scipy.org/doc/numpy/reference/generated/numpy.fromfile.html – dermen

1

這也應該起作用。沒有理由你不能做到這一切在一個單一的讀:

vort = np.fromfile(fid, np.float64).reshape((model_times,5,48,40)).transpose() 

你必須要小心,重塑1-d陣列到陣列中的索引的順序本地文件中(model_times,5,48 ,40),然後使用轉置重新排列索引到你想要的(40,48,5,model_times)。如果你試圖直接重塑後者,你會得到錯誤的地方的數據。

+0

我給了這個嘗試,但仍然得到了我前面描述的ValueError。作爲一個測試,我把打印np.shape(np.fromfile(fid,np.float64))和形狀發現是(6048000,)。 –