f2pyを介して1D配列としてfortranサブルーチンから読み取られる配列があります。次に、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
次に、その配列を 3D 配列として fortran に戻したいと思います。
some_data=fortran_routine(a)
問題は、f2py が fortran_routine に渡す前に a を転置しようとし続けることです。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
すべての転置を前後に防ぐにはどうすればよいですか? (私は、2 つの言語で異なる配列のインデックス付け規則を使用できることを非常に嬉しく思います)。
編集
解決策の一部であるように思われますが、それがどの部分であるかを理解できないようです(または、の後np.asfortranarray
に? が続く可能性があります)。np.flags.f_contiguous
ravel
reshape(shape,order='F')
編集
この投稿は混乱を招いたようです。ここでの問題は、メモリ レイアウトではなくインデックス スキームf2py
を保持しようとすることです。そのため、 shape を持つ numpy 配列 (C オーダー) がある場合、f2py は fortran でも配列に shape を持たせようとします。f2py がメモリ レイアウトを保持していた場合、配列はPython とFortran で形状を持つことになります。メモリ レイアウトを保持したい。(nz, ny, nx)
(nz, ny, nx)
(nz, ny, nx)
(nx, ny ,nz)