【发布时间】: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