f2py防止数组重新排序

2024-04-25 17:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数组,它通过f2py从fortran子例程中读取为1D数组。然后在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。在

^{pr2}$

问题是f2py在传递给fortran_例程之前一直试图转置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或{}在溶液中应该有一部分,我只是不知道那是什么部分(或者可能是ravel,然后是reshape(shape,order='F')?在

编辑

这篇文章似乎引起了一些混乱。这里的问题是f2py试图保留索引方案而不是内存布局。所以,如果我有一个numpy数组(按C顺序)的形状是(nz, ny, nx),那么f2py会尝试在fortran中使该数组也具有形状(nz, ny, nx)。如果f2py保留内存布局,那么在python中数组的形状为(nz, ny, nx),而fortran中则为(nx, ny ,nz)。我想保留内存布局。在


Tags: 内存innporder数组布局例程形状
2条回答

答案似乎很简单:

b=np.ravel(a).reshape(tuple(reversed(a.shape)),order='F')

很有效,但很明显,这和:

^{pr2}$

因为transpose返回一个视图,快速查看一下b.flags与{}的比较,这就是我想要的。(b.flags是F\u连续的)。在

Fortran并不颠倒轴的顺序,它只是将数据存储在内存中,与C/Python不同。您可以告诉numpy以Fortran顺序存储数据,这与反转轴是不同的。在

我会把你的代码改写成这样

a=np.zeros(nx*ny*nz)
read_fortran_array(a)
a=a.reshape(nx,ny,nz, order='F') # It is now in Fortran order

现在,f2py在传递时不会尝试重新排序数组。在

作为旁注,这也会起作用

^{pr2}$

因为在幕后,f2py在向Fortran例程传递C顺序数组时会执行以下操作:

a=a.flatten() # Flatten array (Make 1-D)
a=a.reshape(nx,ny,nz, order='F')  # Place into Fortran order

当然,从一开始就以Fortran顺序存储更有效。在

一般来说,除非有一个性能关键的部分,否则不必担心数组的排序,因为f2py会为您处理这个问题。在

相关问题 更多 >

    热门问题