我有一组时间步长(以秒为单位)和一组位置(纬度)。两个阵列的大小相同,N = 36。我正在计算两个数组之间的np.gradient,当两个连续时间步长相同时返回nan值。但是,当我使用常数标量作为vararg值来计算梯度时,会得到正确的数据输出。我需要找到一种方法来创建具有不同时间步长的正确梯度输出。
使用Python 3.4和Numpy 1.14
我尝试使用原始的timestep数组计算梯度,该数组在值相同时返回nan值。接下来,我尝试使用单个标量值作为vararg输入来计算梯度,从而为我提供了正确的输出。然后,我尝试将vararg设置为具有所有相同时间步长值的numpy数组,这将返回所有-inf值。
#Original Code:
dt = np.array([10800,10800,9900,5400,6300]) #delta time in seconds
x = np.array([-85.18,-85.80,-86.3,-87,-87.0]) #delta x in decimal degrees
dx_dt = np.gradient(x,dt)
#returns:
#[nan,nan, 4.8e-004,-3.1e-004,-2.19e-004]
#Test 1 - test with constant scalar
dx_dt = np.gradient(x,10800)
#returns:
#[-5.5e-5,-5.1e-5,-5.5e-5,-4.1e-5,-5.1e-5]
#Test 2 - test with constant array
dt = np.array([10800,10800,10800,10800,10800)]
dx_dt = np.gradient(x,dt)
#returns:
#[-inf,-inf,-inf,-inf,-inf]
我希望np.gradient(x,10800)的输出与np.gradient(x,np.array([10800,10800,10800,10800,10800]))相同,但是不是。
我需要一个没有nan或inf值的输出,以便下一部分代码正常工作,将-inf或nans设置为0并没有帮助。
答案 0 :(得分:1)
对于numpy.gradient
,当varargs
是一个数组时,必须给出沿t
的值的坐标,而不是增量。请参阅下面np.gradient
documentation的第3点。
varargs:标量或数组列表,可选
f值之间的间距。所有尺寸的默认单位间距。间距可以使用:
- 单个标量,用于指定所有尺寸的样本距离。
N个标量,用于为每个维度指定恒定的采样距离。即dx,dy,dz,...
N个数组,用于指定沿F的每个维度的值的坐标。数组的长度必须与相应维度的大小匹配。
- N个标量/数组的任意组合,其含义分别为2和3。
要获取渐变,可以使用np.cumsum
从增量中获取坐标:
dt = np.array([10800,10800,9900,5400,6300]) #delta time in seconds
t = np.cumsum(dt)
x = np.array([-85.18,-85.80,-86.3,-87,-87.0]) #delta x in decimal degrees
dx_dt = np.gradient(x,t)
哪个给:
[-5.74074074e-05 -5.38061777e-05 -1.01703308e-04 -6.98005698e-05 0.00000000e+00]
您可以检查:
dx_dt = np.gradient(x,10800)
和
dt = np.array([10800,10800,10800,10800,10800])
t = np.cumsum(dt)
dx_dt = np.gradient(x,t)
给出相同的结果:
[-5.74074074e-05 -5.18518519e-05 -5.55555556e-05 -3.24074074e-05 0.00000000e+00]