我得到一个512 ^ 3数组,表示模拟的温度分布(用Fortran编写).该数组存储在大小约为1/2G的二进制文件中.我需要知道这个数组的最小值,最大值和平均值,因为我很快就需要了解Fortran代码,我决定试一试,并提出了以下非常简单的例程.
integer gridsize,unit,j
real mini,maxi
double precision mean
gridsize=512
unit=40
open(unit=unit,file='T.out',status='old',access='stream',&
form='unformatted',action='read')
read(unit=unit) tmp
mini=tmp
maxi=tmp
mean=tmp
do j=2,gridsize**3
read(unit=unit) tmp
if(tmp>maxi)then
maxi=tmp
elseif(tmp<mini)then
mini=tmp
end if
mean=mean+tmp
end do
mean=mean/gridsize**3
close(unit=unit)
Run Code Online (Sandbox Code Playgroud)
在我使用的机器上,每个文件大约需要25秒.这让我觉得很长,所以我继续在Python中做了以下事情:
import numpy
mmap=numpy.memmap('T.out',dtype='float32',mode='r',offset=4,\
shape=(512,512,512),order='F')
mini=numpy.amin(mmap)
maxi=numpy.amax(mmap)
mean=numpy.mean(mmap)
Run Code Online (Sandbox Code Playgroud)
现在,我预计这会更快,但我真的被吹走了.在相同条件下只需不到一秒钟.平均值偏离我的Fortran例程发现的那个(我也使用128位浮点运行,所以我不知何故更多地信任它),但仅限于第7位有效数字左右.
numpy怎么这么快?我的意思是你必须查看数组的每个条目才能找到这些值,对吧?我在Fortran程序中做了一件非常愚蠢的事情,因为它花了这么长时间吗?
编辑:
要回答评论中的问题:
iso_fortran_env
它提供128位浮点数.编辑2:
我实现了@Alexander Vogt和@casey在他们的答案中提出的建议,它的速度一样快,numpy
但现在我有一个精确的问题,因为@Luaan指出我可能会得到.使用32位浮点数组,计算出的平均值sum
为20%.干
...
real,allocatable :: tmp (:,:,:)
double precision,allocatable :: tmp2(:,:,:)
...
tmp2=tmp
mean=sum(tmp2)/size(tmp)
...
Run Code Online (Sandbox Code Playgroud)
解决了这个问题但增加了计算时间(不是很多,但显着).有没有更好的方法来解决这个问题?我找不到从文件中直接读单打的方法.怎么numpy
避免这个?
感谢目前为止所有的帮助.
我必须绘制一些数据和一些垂直线来划定有趣的间隔,然后我想添加一些标签text
.我不能完全避免标签与数据或垂直线重叠,所以我决定bbox
在文本周围放置以保持可读性.我的问题是我无法在此框中集中对齐它,这在我看来是清晰可见的并且非常烦人.
我正在做这样的事情:
import numpy
import matplotlib
import matplotlib.pyplot as plt
fig=plt.figure()
plot=fig.add_subplot(111)
x=numpy.linspace(1,10,50)
y=numpy.random.random(50)
plot.plot(x,y)
plot.text(4.5,.5,'TEST TEST',\
bbox={'facecolor':'white','alpha':1,'edgecolor':'none','pad':1})
plot.axvline(5,color='k',linestyle='solid')
plt.show()
Run Code Online (Sandbox Code Playgroud)
很明显,文本并不以其为中心bbox
.我怎么能改变这个?我花了很长时间在Google上,但我找不到任何东西.
编辑:
感谢您的建议到目前为止.
这表明我所看到的实际上是所希望的行为.显然bbox
,新版本的matplotlib
选择考虑了它所包含的文本可能的最大下降('g'的下降).
当文本中出现"g"时,这确实看起来很好:
不幸的是,在我的情况下,没有'g'或任何类似下降的东西.有没有人有任何进一步的想法?