Numpy linspace意外输出

时间:2016-07-12 15:17:40

标签: python arrays python-2.7 numpy

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

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通过修改某些部分。例如,如果我插入代码

zmax = int(zmax)

然后len(z)= 501.但我想知道为什么初始代码完全按照书面形式产生长度为501的数组z?

(我使用的是Python 2.7。)

2 个答案:

答案 0 :(得分:0)

这与浮点算术不准确有关。碰巧intervalz的公式会产生500.99999999999994。这只是你可以在SO上找到的浮动精度问题。然后np.linspace命令将此数字设为500而不是501.

由于linspace需要int,所以最好确保给它一个。

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

intervalz = Ngridz + 1

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

以来

答案 1 :(得分:0)

这是一个四舍五入的问题。如果你试图从intervalz中减去501,你会发现一个非常小的负数,-5.68e-14; linspace只占用它的整数部分,即500,并提供一个500长的列表。

请注意代码的其他两个问题:

  1. dt未提供正确的间距,因为您没有删除初始tdz相同)
  2. NgridtNgridz在概念上是整数,而您将它们初始化为浮点数。只需删除末尾的点。
  3. 我认为您的代码可以通过编写简化(请注意NgridtNgridz已初始化为501)

    #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)