【问题标题】:numpy.gradient returning nan values when using varargs array with constant valuesnumpy.gradient 在使用具有常量值的可变参数数组时返回 nan 值
【发布时间】:2019-09-22 06:00:42
【问题描述】:

我有一组时间步长(以秒为单位)和一组位置(以纬度为单位)。两个数组大小相同,N=36。我正在计算两个数组之间的 np.gradient ,当任何两个连续时间步长相同时返回 nan 值。但是当我使用一个常数标量作为可变参数值来计算梯度时,我得到了正确的数据输出。我需要找到一种方法来创建具有不同时间步长的正确梯度输出。

使用 Python 3.4 和 Numpy 1.14

我尝试使用原始时间步长数组计算梯度,当值相同时,该数组返回 nan 值。接下来,我尝试使用单个标量值作为可变参数输入来计算梯度,这给了我正确的输出。然后,我尝试将 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 没有帮助。

【问题讨论】:

    标签: python numpy gradient


    【解决方案1】:

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

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

    f 值之间的间距。所有尺寸的默认单一间距。可以使用以下方式指定间距:

    1. 单个标量指定所有维度的样本距离。

    2. N个标量为每个维度指定一个恒定的样本距离。即 dx, dy, dz, ...

    3. N个数组来指定值沿F的每个维度的坐标。数组的长度必须与对应维度的大小相匹配。

    4. 具有 2. 和 3 含义的 N 个标量/数组的任意组合。

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

    【讨论】:

      猜你喜欢
      • 2015-11-05
      • 1970-01-01
      • 2020-10-21
      • 2014-04-21
      • 1970-01-01
      • 2022-01-15
      • 2020-03-27
      • 2023-04-03
      • 2013-03-20
      相关资源
      最近更新 更多