我有一个数组,它通过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