我有一个数组,它通过 f2py 从 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
如何防止所有来回转调?(我很高兴在两种语言中使用不同的数组索引约定)。
编辑
似乎np.asfortranarray
或np.flags.f_contiguous
应该在解决方案中包含某些部分,我似乎无法弄清楚那是什么部分(或者可能是 aravel
后跟 a reshape(shape,order='F')
?
编辑
看来这篇文章引起了一些混乱。这里的问题是f2py
试图保留索引方案而不是内存布局。因此,如果我有一个带有 shape 的 numpy 数组(按 C 顺序)(nz, ny, nx)
,那么 f2py 会尝试使该数组也具有(nz, ny, nx)
fortran 中的形状。如果 f2py 保留内存布局,则数组将(nz, ny, nx)
在 python 和(nx, ny ,nz)
fortran 中具有形状。我想保留内存布局。