2015-11-03 64 views
1

現在我試圖將fortran代碼重寫爲python腳本。fortran和python之間的解釋

在原來的Fortran代碼,它宣稱的實數:

real a(n),b(n),D(64) 

這裏我怎麼能在Python代碼轉換此d(64)? (n),b(n)是我使用的數據的值,但D(64)不是。 我需要把它放到我用f2py包裝的子模塊fortran代碼中。 該子模塊代碼如下所示。 M只是一個將在主代碼中定義的整數。

subroutine multires (a,b,M, D) 
    implicit none 
    real a(*),b(*),D(*) 
     . 
     . 

    if(nw.gt.1) D(ms+1)=(sumab/nw) 

回答

2

Python是動態類型的,因此您不必使用它們的類型聲明變量。 Fortran數組可以在Python列表中進行翻譯,但由於您不應該將元素動態添加到列表中,因此應將其初始化爲其大小。所以Fortran的real D(64)有可能成爲在Python:

D = [ 0. for i in range(64) ] 

(聲明D是一個列表,並與64個0.值初始化)

當然,如果你能使用numpy的並不僅僅是普通的Python,你可以使用numpy.array類型。在其他特性(效率,類型控制,...)中,可以用F(用於Fortran)順序來聲明,這意味着第一個索引變化最快,正如Fortran程序員習慣的那樣。

+0

謝謝Serge Ballesta – Isaac

+2

更短:'D = 64 * [0]' – Stefan

+5

Fortran數組最靠近Python數組,而不是列表。 (所有相同類型的項目,存儲空間和訪問時間最小化)。 Python數組通常通過numpy模塊進行槓桿化。如果您要轉換的Fortran代碼在計算上要求很高,那麼您應該使用numpy轉換它,而不是使用vanilla Python。 – nigel222

4

如果你的代碼正在尋找良好的性能,stay away from python lists。相反,你想使用numpy數組。

import numpy as np 
D = np.zeros((64), np.float32) 

這將構造一個numpy的ndarray與初始化爲0的32個實數64個元件用這些種類的陣列,而不是列出的可以大大提高的Python代碼以上列出的性能。它們還可以更好地控制互操作性的打字,並且減少開銷,特別是在進入cython時。

+0

謝謝凱西,你的建議真的有效! – Isaac