我有一个数组,它通过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)
。我想保留内存布局。在
答案似乎很简单:
很有效,但很明显,这和:
^{pr2}$因为transpose返回一个视图,快速查看一下}的比较,这就是我想要的。(
b.flags
与{b.flags
是F\u连续的)。在Fortran并不颠倒轴的顺序,它只是将数据存储在内存中,与C/Python不同。您可以告诉numpy以Fortran顺序存储数据,这与反转轴是不同的。在
我会把你的代码改写成这样
现在,f2py在传递时不会尝试重新排序数组。在
作为旁注,这也会起作用
^{pr2}$因为在幕后,f2py在向Fortran例程传递C顺序数组时会执行以下操作:
当然,从一开始就以Fortran顺序存储更有效。在
一般来说,除非有一个性能关键的部分,否则不必担心数组的排序,因为f2py会为您处理这个问题。在
相关问题 更多 >
编程相关推荐