[英]Spacing values to calculate a gradient using numpy.gradient in a pandas dataframe
[英]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 值之间的间距。 所有尺寸的默认统一间距。 可以使用以下方法指定间距:
单个标量指定所有维度的样本距离。
N 个标量,用于为每个维度指定一个恒定的样本距离。 即 dx, dy, dz, ...
N 个数组,用于指定值沿 F 的每个维度的坐标。数组的长度必须与相应维度的大小匹配。
具有 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.