numpy.gradient在使用具有常量值的varargs数组时返回nan值

时间:2019-05-03 16:42:55

标签: python numpy gradient

我有一组时间步长(以秒为单位)和一组位置(纬度)。两个阵列的大小相同,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并没有帮助。

1 个答案:

答案 0 :(得分:1)

对于numpy.gradient,当varargs是一个数组时,必须给出沿t的值的坐标,而不是增量。请参阅下面np.gradient documentation的第3点。

  

varargs:标量或数组列表,可选

     

f值之间的间距。所有尺寸的默认单位间距。间距可以使用:

     
      
  1. 单个标量,用于指定所有尺寸的样本距离。
  2.   
  3. N个标量,用于为每个维度指定恒定的采样距离。即dx,dy,dz,...

  4.   
  5. N个数组,用于指定沿F的每个维度的值的坐标。数组的长度必须与相应维度的大小匹配。

  6.   
  7. N个标量/数组的任意组合,其含义分别为2和3。
  8.   

要获取渐变,可以使用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]