f2py функции с массивом значений

Поддерживают ли последние версии f2py перенос функций fortran с массивом значений? В некоторых древних документах это не поддерживалось. Как насчет этого сейчас?

Давайте, например, сохраним следующую функцию как func.f95.

function func(x)
    implicit none
    double precision :: x(:),func(size(x))
    integer :: i
    do i=1,size(x)
        func(i) = i*x(i)
    end do
end function

Я компилирую это с помощью f2py --fcompiler=gnu95 -c -m func func.f95

Затем пусть следующий код Python будет test_func.py

import func
from numpy import array

x = array(xrange(1,10),dtype='float64')
print 'x=',x

y = func.func(x)
print 'func(x)=',y

Результатом
python test_func.py является

x= [ 1.  2.  3.  4.  5.  6.  7.  8.  9.]
Segmentation fault

person Tentresh    schedule 06.06.2012    source источник
comment
вы можете использовать обходной путь, описанный в этом ответе..., но для этого потребуется больше оценок, чем требуется. В этом случае я бы выбрал Cython   -  person Saullo G. P. Castro    schedule 13.08.2013


Ответы (1)


Механизм f2py превращает подпрограммы Фортрана в функции Python. Он не понимает, как превратить функцию Фортрана в функцию Python. Я обнаружил, что мне нужно обернуть все функции Фортрана подпрограммой или, что еще лучше, переписать их как подпрограммы.

person SethMMorton    schedule 06.06.2012
comment
Является ли f2py настолько мощным? Достаточно ли надежно то, что написание всей кодовой базы на Фортране таким особым образом является справедливой ценой? - person Tentresh; 06.06.2012
comment
У меня никогда не было проблем с надежностью, но, как я уже сказал, это расстраивает. Лично я использую его только для небольших проектов из-за ограничений, которые он накладывает. Есть еще один инструмент, fwrap, который должен быть лучше, чем f2py, но я его не тестировал. . - person SethMMorton; 06.06.2012