我有一個數組,它通過f2py從fortran子程序讀取爲一維數組。然後在蟒蛇,該數組被重塑: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不停地嘗試傳遞給fortran_routine前轉一個。 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
嘗試保留索引方案而不是內存佈局。所以,如果我有一個形狀爲(nz, ny, nx)
的numpy數組(形式爲C),那麼f2py會嘗試使數組在Fortran中的形狀爲(nz, ny, nx)
。如果f2py保留內存佈局,則該陣列將在python中形成(nz, ny, nx)
,在fortran中形成(nx, ny ,nz)
。我想保留內存佈局。
喜mgilson,對此問題非常快速的問題。我寫了一個fortran代碼,它需要一個3d數組作爲輸入: – toylas