繁体   English   中英

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

[英]numpy.gradient returning nan values when using varargs array with constant values

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

对于numpy.gradient ,当varargs是一个数组时,必须给出沿t的值的坐标,而不是增量。 请参阅下面的np.gradient文档的第 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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM