F2Py: работа с выделяемыми массивами в Fortran при вызове через Python

Используя F2Py для компиляции подпрограмм Fortran, подходящих для использования в Python, следующий фрагмент кода успешно скомпилирован, сконфигурированный gfortran в качестве компилятора при использовании F2Py, однако во время вызова в Python возникает ошибка времени выполнения!
Любой комментарии и решения?

function select(x) result(y)
   implicit none
   integer,intent(in):: x(:) 
   integer:: i,j,temp(size(x))
   integer,allocatable:: y(:)
   j = 0
   do i=1,size(x)
      if (x(i)/=0) then
         j = j+1
         temp(j) = x(i)
      endif
   enddo
   allocate(y(j))
   y = temp(:j)
end function select

Аналогичный пост StackOverflow можно найти здесь.


person Developer    schedule 13.12.2011    source источник
comment
Не могли бы вы также опубликовать код Python?   -  person Vladimir F    schedule 14.12.2011
comment
Список f2py также был бы хорошим местом для вопросов, ответы обычно довольно быстрые.   -  person bdforbes    schedule 15.12.2011
comment
@VladimirF Код, который я использовал для его вызова в Python: import test; print test.select([0,1,2,9,5]) при условии, что я уже скомпилировал его как test.pyd.   -  person Developer    schedule 15.12.2011
comment
@bdforbes Спасибо за подсказку. Я представил и поддержал список, посмотрев на эту страницу и дав мне несколько идей решения.   -  person Developer    schedule 15.12.2011


Ответы (2)


Взгляните на эту статью http://www.shocksolution.com/2009/09/f2py-binding-fortran-python , особенно на примере и значении

!f2py depend(len_a) a, bar

Однако автор не затрагивает проблемы генерации массива разного размера.

person Vladimir F    schedule 15.12.2011
comment
Спасибо за ссылку. Однако проблема в том, что мы не знаем, каков размер выходного массива! - person Developer; 15.12.2011

Ваша функция должна быть объявлена:

function select(n,x) result(y)
   implicit none
   integer,intent(in) :: n
   integer,intent(in) :: x(n) 
   integer :: y(n) ! in maximizing the size of y
   ...

Действительно, Python написан на C, и ваша подпрограмма Fortran должна следовать правилам Iso_C_binding. В частности, массивы предполагаемой формы запрещены.

В любом случае я бы предпочел подпрограмму:

  subroutine select(nx,y,ny,y)
     implicit none
     integer,intent(in) :: nx,x(nx)
     integer,intent(out) :: ny,y(nx)

ny — размер, реально используемый для y (ny ‹= nx)

person Francois Jacq    schedule 13.03.2014
comment
Нет, f2py правильно обрабатывает предполагаемые массивы форм. - person Vladimir F; 13.03.2014
comment
ХОРОШО. Приятно учиться. Но я не понимаю, как это можно сделать портативным способом... - person Francois Jacq; 13.03.2014