f2py — запретить переупорядочивание массива

У меня есть массив, который читается из подпрограммы fortran как массив 1D через f2py. Затем в Python этот массив изменяется :

a=np.zeros(nx*ny*nz)
read_fortran_array(a)
a=a.reshape(nz,ny,nx)  #in fortran, the order is a(nx,ny,nz), C/Python it is reversed

. Теперь я хотел бы передать этот массив обратно в фортран как трехмерный массив.

some_data=fortran_routine(a)

Проблема в том, что f2py продолжает пытаться транспонировать перед переходом к подпрограмме fortran _. подпрограмма fortran выглядит так:

subroutine fortran_routine(nx,ny,nz,a,b)
real a
real b
integer nx,ny,nz
!f2py intent(hidden) nx,ny,nz
!f2py intent(in) a
!f2py intent(out) b
...
end subroutine

Как предотвратить все транспонирование туда и обратно? (Я очень рад использовать разные соглашения об индексации массивов в двух языках ).

РЕДАКТИРОВАТЬ

Кажется, что np.asfortranarrayили np.flags.f_contiguousдолжны иметь какую-то часть решения, я просто не могу понять, какая это часть (или, может быть, ravel, за которой следует reshape(shape,order='F')?

РЕДАКТИРОВАТЬ

Кажется, этот пост вызвал некоторое замешательство. Проблема здесь в том, что f2pyпытается сохранить схему индексации вместо структуры памяти . Итак, если у меня есть массив numpy (в порядке C )с формой (nz, ny, nx), то f2py пытается сделать так, чтобы массив имел форму (nz, ny, nx)и в фортране.Если бы f2py сохранял структуру памяти , массив имел бы форму (nz, ny, nx)в питоне и (nx, ny,nz)в фортране. Я хочу сохранить структуру памяти.

8
задан Chiel 1 October 2017 в 11:32
поделиться