首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy linspace意外输出

Numpy linspace意外输出
EN

Stack Overflow用户
提问于 2016-07-12 15:17:39
回答 2查看 372关注 0票数 0

我正在运行下面的代码,为每个z和t构建一个一维数组。目前,我正试图使它们的大小等效,以便它们的长度都为501。

代码语言:javascript
复制
import numpy as np

#constants & parameters
omega = 1.
eps = 1.
c = 3.*(10.**8.)
hbar = 1.
eta = 0.01
nn = 10.**7. 
n = eta*nn 

lambdaOH = c/(1612.*10.**(6.)) 
gamma = 1.282*(10.**(-11.))
Tsp = 1./gamma
TR = 604800. 
L = (Tsp/TR)*(np.pi)/((3.*(lambdaOH**2.))*n)

#time
Ngridt = 500.
tmax = 1. 
dt = tmax/Ngridt
intervalt = tmax/dt + 1 
t = np.linspace(0.01,tmax,intervalt)

#z space
Ngridz = 500.
zmax = L
dz = zmax/Ngridz 
intervalz = zmax/dz + 1
z = np.linspace(0.01,zmax,intervalz) 

运行代码时,intervalt和intervalz都等于501.0,但在检查z和t的长度时,len(z) = 500,len(t) =501。我使用了上面的代码,通过修改某些部分获得len(z) = 501。例如,如果我插入代码

代码语言:javascript
复制
zmax = int(zmax)

然后len(z) = 501。但是,我想知道为什么最初的代码,完全按照所写的方式,不产生长度为501的数组z?

(我正在使用Python2.7。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-12 15:42:08

这是一个四舍五入问题。如果您尝试从intervalz中减去501,您会发现一个非常小的负数,-5.68e-14;行空间只取其中的整数部分,即500,并提供一个500长的列表。

注意代码中的另外两个问题:

  1. dt没有提供正确的间距,因为您没有删除初始的t (dz也是一样)
  2. NgridtNgridz在概念上是整数,而将它们初始化为浮点数。只要去掉末端的点就行了。

我认为您的代码可以通过编写来简化(注意,NgridtNgridz被初始化为501)

代码语言:javascript
复制
#time
Ngridt = 501
tmax = 1. 
t, dt = np.linspace(0.01,tmax,Ngridt,retstep=True)

#z space
Ngridz = 501
zmax = L
z, dz = np.linspace(0.01,zmax,Ngridz,retstep=True) 
票数 0
EN

Stack Overflow用户

发布于 2016-07-12 15:32:41

这与浮点数不准确有关。恰好,intervalz的公式产生了500.99999999999994。这只是浮动精度的问题,你可以找到到处都这样。然后,np.linspace命令将这个数字取为500,而不是501。

因为linspace期望有一个int,所以最好确保给它一个。

顺便说一句:从数学上讲,我不明白你为什么不

代码语言:javascript
复制
intervalz = Ngridz + 1

intervalz = zmax/dz + 1 = zmax/(zmax/Ngridz) + 1 = Ngridz + 1以来

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38332917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档