我正在使用Python生成一些初始數據,例如'X'等二維數組的形式,然後使用Fortran對它們進行一些計算。最初當數組大小約爲10,000 x 10,000時,np.savetxt在速度方面表現良好。但是一旦我開始增加陣列的尺寸,savetxt的速度就會明顯變慢。所以我嘗試了np.save,這樣可以節省很多的速度,但是文件保存爲.npy格式。我將如何閱讀Fortran中的這樣一個文件來重建原始數組?從我讀過的內容來看,二進制通常會導致最低的空間消耗和最快的速度。從.npy文件讀取數組到Fortran 90
Fortran 90中,
open(10,file='/home/X.npy')
read(10,*)X
我收到以下錯誤:Fortran運行時錯誤:錯誤的實數列表中輸入第1項
編輯: 在Python中我做到這一點,
import numpy as np
x = np.linspace(-50,50,10)
y = np.linspace(-50,50,10)
X,Y = np.meshgrid(x,y)
np.save('X',X)
然後在Fortran中,我這樣做,
program read_unformatted_binary_from_python
use iso_c_binding
implicit none
integer, parameter :: DPR = selected_real_kind(p=15)
character(len=*), parameter :: filename = 'X.npy'
integer, parameter :: N = 10
real(DPR), allocatable, dimension(:, :) :: X
allocate(X(N, N))
open(40, file=filename, status='old', access='stream', form='unformatted')
read(40) X
close(40)
write(*,*) X
end program read_unformatted_binary_from_python
輸出開始與1.8758506894003703E-309 1.1711999948023422E + 171 5.2274167985502976E-037 8.4474009688929314E + 252 2.345660E + 180 9.9215260506210473E + 247 2.1620996769994603E + 233 7.5805790251297605E-096 3.4756671925988047E-152 6.5549091408576423E-260 -50.000000000000000 - 38.888888888888886 -27.777777777777779等
使用.bin格式時不會發生此錯誤,僅在使用導致npy的np.save時纔會發生。
Fortran不會自動讀取並正確解釋任意二進制文件。您將不得不尋找或編寫專門針對該格式的例程。這是相對良好的文件和您最喜愛的搜索引擎將幫助您追蹤其描述。順帶一提,錯誤消息表明文件的前4個(或可能8個)字節不能被解釋爲Fortran「真實」。 –
更糟糕的是,它已經在代碼片段中的格式化閱讀中打開,因此它試圖以文本形式讀取一個數字。這是行不通的。您正在談論二進制文件,但是您沒有打開二進制文件(未格式化)的I/O。 –
並始終使用標籤[tag:fortran],以便更多人可以看到您的問題。 Fortran 90只是一箇舊版本 - 現在已過時。 Fortran 90不適合執行此任務,您需要從Fortran 2003中流式I/O。 –