2015-11-03 3 views
1

Теперь я пытаюсь переписать код fortran в скрипт python.Интерпретация между fortran и python

В исходном коде Fortran, он заявляет, действительное число, как:

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

Вот как я могу преобразовать этот D (64) в питона коде? a (n), b (n) - значения из данных, которые я использовал, но D (64) - нет. Мне нужно поместить это в код sub-module fortran, который я обернул f2py. Код подмодуля выглядит следующим образом. 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 type. Среди других качеств (эффективность, управление типом ...) он может быть объявлен с помощью порядка 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 с 64 элементами 32-битных чисел инициализируется 0. Использование такого рода массивов, а не списки могут значительно улучшить производительность вашего кода питона по спискам. Они также дают вам более тонкий контроль над типизацией для взаимодействия, и вы несете накладные расходы, особенно если вы попадаете на cython.

+0

Спасибо Кейси, ваш совет действительно работает! – Isaac