Tôi có một mảng được đọc từ một chương trình con fortran dưới dạng mảng 1D qua f2py. Sau đó, trong python, mảng đó được định cấu hình lại:f2py - ngăn chặn sắp xếp lại mảng
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
Bây giờ tôi muốn chuyển mảng đó trở lại fortran dưới dạng mảng 3D.
some_data=fortran_routine(a)
Vấn đề là f2py cố gắng chuyển vị trí trước khi chuyển đến fortran_routine. thói quen fortran trông giống như:
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
Làm thế nào để ngăn chặn tất cả các transposing lui? (Tôi hoàn toàn hài lòng khi sử dụng các quy ước lập chỉ mục mảng khác nhau trong hai ngôn ngữ).
EDIT
Dường như np.asfortranarray
hoặc np.flags.f_contiguous
nên có một số phần trong giải pháp, tôi chỉ có thể dường như không tìm ra những gì phần đó là (hoặc có thể là một ravel
theo sau là một reshape(shape,order='F')
?
EDIT
có vẻ như bài này đã gây ra một số rắc rối. vấn đề ở đây là f2py
nỗ lực để bảo vệ lược đồ lập chỉ mục thay vì bố cục bộ nhớ . Vì vậy, nếu tôi có một mảng numpy (theo thứ tự C) với hình dạng (nz, ny, nx)
, sau đó f2py cố gắng để làm cho mảng có hình dạng (nz, ny, nx)
trong fortran quá. Nếu f2py được giữ lại bố cục bộ nhớ, mảng sẽ có hình dạng (nz, ny, nx)
trong python và (nx, ny ,nz)
trong fortran. Tôi muốn bảo tồn bố cục bộ nhớ.
hi mgilson, một câu hỏi nhanh về vấn đề này. Tôi đã viết một mã fortran mà mất một mảng 3d như đầu vào: – toylas