python趨勢圖 - yticks python




f2py-防止數組重新排序 (2)

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不會在傳遞時重新排列數組。

作為一個側面說明,這也將起作用

a=a.reshape(nx,ny,nz) # Store in C order

因為在幕後,當您將C順序數組傳遞給Fortran例程時,f2py執行這些操作:

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

但是,從一開始就按照Fortran順序存儲它當然更有效率。

一般來說,除非你有一個性能關鍵的部分,否則你不必擔心數組排序問題,因為f2py為你處理這個問題。

我有一個數組,通過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之前一直試圖轉置一個。 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.asfortranarraynp.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) 。 我想保留內存佈局。


看起來答案是相當簡單的:

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

工作,但顯然,這是一樣的事情:

b=a.T

因為轉置返回一個視圖,快速看b.flagsb.flags相比,這是我想要的。 ( b.flags是F_CONTIGUOUS)。





f2py