У меня есть массив, который считывается из подпрограммы fortran как 1D-массив через f2py. Тогда в питоне, что массив получает реорганизован:f2py - предотвратить переупорядочение массива
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
Теперь я хотел бы передать этот массив обратно в FORtran в качестве 3D-массива.
some_data=fortran_routine(a)
Проблема в том, что f2py продолжает пытаться транспонировать a перед передачей fortran_routine. Фортран процедура выглядит следующим образом:
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
Как предотвратить все Транспонирование назад и вперед? (Я полностью счастлив использовать различные соглашения индексирования массива на двух языках).
EDIT
кажется, что np.asfortranarray
или np.flags.f_contiguous
должны иметь какую-то часть в решении, я просто не могу показаться, чтобы выяснить, какая часть, которая является (или может быть ravel
с последующим reshape(shape,order='F')
?
EDIT
кажется, этот пост вызвало некоторое замешательство. проблема здесь состоит в том, что f2py
попытки сохранить индексная схема вместо расположение памяти. Итак, если у меня есть массив numpy (в порядке C) с формой (nz, ny, nx)
, то f2py пытается сделать массив в форме forform тоже (nz, ny, nx)
. Если f2py сохранял формат памяти, массив имел бы форму (nz, ny, nx)
в python и (nx, ny ,nz)
в fortran. Я хочу сохранить макет памяти.
привет mgilson, быстрый вопрос относительно этой самой проблемы. Я написал код fortran, который принимает 3D-массив как входной: – toylas