2011-10-21 108 views
5

我有一個3D(時間,X,Y)numpy數組,包含6個小時時間系列幾年。 (說5)。我想創建一個採樣時間序列,其中包含從可用記錄中隨機抽取的每個日曆日的1個實例(每天5種可能性),如下所示。什麼是對numpy數組進行取樣的最快方法?

  • 1月1:2006年
  • 1月2日:2011
  • 年1月3日期:2009年
  • ...

,這意味着我需要從01/01/2006取4個值從02/01/2011等 4個值我有一個其工作方式工作版本如下:

  • 重塑輸入數組以添加「年」維(時間,年,X,Y)
  • 在0和4之間創建隨機生成整數的365值數組
  • 使用np.repeat和整數數組只有相關的值:

例子:

sampledValues = Variable[np.arange(numberOfDays * ValuesPerDays), sampledYears.repeat(ValuesPerDays),:,:] 

這似乎是工作,但我想知道如果這是解決我的問題的最佳/最快的方法?速度非常重要,因爲我正在循環做這件事,adn會受益於儘可能多的測試。

我正在做這個對嗎?

感謝

編輯 我忘了提,我過濾輸入數據集刪除月29日閏年。

基本上,該操作的目的是找到一個365天的樣本,可以很好地匹配長期時間序列的平均值等。如果採樣的時間序列通過了我的質量測試,我想導出並重新開始。

回答

3

2008年是366天長,所以不要重塑。

看一看scikits.timeseries

import scikits.timeseries as ts 

start_date = ts.Date('H', '2006-01-01 00:00') 
end_date = ts.Date('H', '2010-12-31 18:00') 
arr3d = ... # your 3D array [time, X, Y] 

dates = ts.date_array(start_date=start_date, end_date=end_date, freq='H')[::6] 
t = ts.time_series(arr3d, dates=dates) 
# just make sure arr3d.shape[0] == len(dates) ! 

現在,您可以訪問t數據與日/月/年的目標:

t[np.logical_and(t.day == 1, t.month == 1)] 

因此,例如:

for day_of_year in xrange(1, 366): 
    year = np.random.randint(2006, 2011) 

    t[np.logical_and(t.day_of_year == day_of_year, t.year == year)] 
    # returns a [4, X, Y] array with data from that day 

玩與t的屬性,使其也與閏年一起工作。

+0

這看起來很有前途! – heltonbiker

+0

我應該提到它,但在這種情況下我並不在意閏年,因爲我已經在輸入時間序列中刪除了所有2月29日的事件。我雖然使用scikits.timeseries,但是我不確定我是否真的會從速度上受益。另外,我可能想在6:00或12:00開始我的日子,所以我不想創建一個datetime對象數組來提取每次我只能使用我的採樣數組(rs = np .random.randint(0,np.size(年),size = 365))。但我可能錯了! – Jahfet

0

由於您可以在採樣過程中嵌入年份尺寸信息,並保留陣列的原始形狀,所以我沒有看到真正需要重新整形陣列。

例如,您可以生成一個隨機偏移量(從0到365),然後選擇索引片,比如n*365 + offset

無論如何,我不認爲你的問題是完整的,因爲我不太明白你需要做什麼,或者爲什麼。

+0

我不知道是否需要重塑操作,我只是認爲這對我來說很方便,因爲我基本上可以很容易地選擇每一天我想要提取哪一年。在進入我的抽樣循環之前,我只需要做一次,所以我認爲這對性能沒有影響。我在這個問題上增加了一些細節,希望你能更好地理解我所追求的。 – Jahfet

相關問題