簡體   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