【问题标题】:Numpy linspace unexpected outputNumpy linspace 意外输出
【发布时间】:2016-07-12 15:17:39
【问题描述】:

我正在运行下面的代码来为每个 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。)

【问题讨论】:

  • 我得到 intervalz = 500.99999999999994,它不等于 501 并解释了输出。也许使用:intervalz = np.ceil(zmax/dz + 1)
  • 如果希望长度相等,为什么还要计算两次长度?您可以只计算一个“间隔”并将其用于两者吗?为什么还要计算 intervalz 和 intervalt 呢?
  • 我发现在这些类型的事情中,将1E-10 添加到您的限制中总是很有用的,以避免 Nikolas 提到的浮点问题。
  • @NikolasRieble 只是在这种特殊情况下,我希望它们是平等的。我将来会改变长度。
  • @zephyr 感谢您的意见。任何一种方法都解决了问题。它似乎取决于应用程序,但出于某种特殊原因,添加 1E-10 是否比 np.ceil 更好?

标签: python arrays python-2.7 numpy


【解决方案1】:

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

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

  1. dt 没有提供正确的间距,因为您没有删除初始的 tdz 也是如此)
  2. NgridtNgridz 在概念上是整数,而您将它们初始化为浮点数。只需删除最后的点即可。

我认为你的代码可以通过编写来简化(注意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) 

【讨论】:

  • 我编辑了答案,因为我在代码的最后一行忘记了 dz。
【解决方案2】:

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

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

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

intervalz = Ngridz + 1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多