2017-12-03 172 views
1

我想找到幾個輸入值在相應的數組中匹配的索引。作爲示例,考慮一個時間序列,數據集包含多個數組:yearsmonthsdayshours。數組的值按時間順序填充。由於數據集是在幾年的時間範圍內收集的,所以years數組將被排序,但其餘數組將不會被排序(因爲hours中的值將僅從每年每月每天0-24進行排序)。即使該數據集是在數年的時間範圍內收集的,數據集也不一定是連續的 - 意味着觀測值之間的天數或小時數(或由連續指數確定的值)可以是大於1(但並非總是)。如何查找與具有已定義層次結構的相應數組中最接近的一組值相對應的索引?

import numpy as np 

years = np.array([2017, 2017, 2018, 2018, 2018, 2018]) 
months = np.array([12, 12, 1, 1, 1, 2]) # 1-12 months in the year 
days = np.array([31, 31, 1, 2, 18, 1]) # 28 (or 29), 30, or 31 days per month 
hours = np.array([4, 2, 17, 12, 3, 15]) # 0-23 hours per day 

def get_matching_time_index(yy, mm, dd, hh): 
    """ This function returns an array of indices at which all values are matched in their corresponding arrays. """ 
    res, = np.where((years == yy) & (months == mm) & (days == dd) & (hours == hh)) 
    return res 

idx_one = get_matching_time_index(2018, 1, 1, 17) 
# >> [2] 

idx_two = get_matching_time_index(2018, 2, 2, 0) 
# >> [] 

idx_one = [2]由於years的第二索引是2018,的months的第二索引是1,的days的第二索引是1,並且hours的第二索引是17。由於idx_two空了,我想擴大我的搜索範圍,找到對應於下一個最近時間的索引。由於每個數組的最後一個索引最接近輸入日期時間參數的相應值,因此我希望返回這些數組的最後一個索引(在這種情況下爲5)。

有人可能會認爲不可能在多個數組中找到最接近的一組值。但在這種情況下,小時優先於日期,優先於月份等。(因爲從輸入時間離開3小時的觀察時間比從輸入時間離開3天的觀察時間更近)。

我發現了很多漂亮的解決方案,可以在一個陣列上工作via this post on StackOverflow,但不適用於適用於多個陣列的情況。此外,發佈的最有效的解決方案假定數組是排序的,而在我的示例中唯一排序的數組是年數。

我想我可以重複該操作中建議的操作,對每個多重數組重複相同的過程 - 這樣,我可以找到每個數組通用的索引。然後,可以計算在公共索引處找到的輸入時間參數和時間參數的差異。從較小單位的陣列(在這種情況下爲hours)開始,可以選擇對應於最小差異的指數。但是,我覺得有一種更簡單的方法可能更有效。

如何才能更好地處理此問題,以便通過多個數組找到與最接近的數據點分組對應的索引?這是多維數組變得方便嗎?

編輯: 第二個想法是,可以將所有時間參數轉換爲經過時間。然後,可以找到與經過的小時內離得最近的觀察值相對應的指數。無論如何,我仍然對解決這個問題的各種方式感到好奇。

回答

1

您的編輯包含可能是個好主意。

快速的安全方式來實現即:

In [93]: dates=np.vectorize(datetime.datetime)(years,months,days,hours) 

In [94]: np.abs(datetime.datetime(2018, 1, 1, 0)-dates).argmin() 
Out[94]: 2 
相關問題