簡體   English   中英

采樣numpy數組的最快方法是什么?

[英]What is the fastest way to sample slices of numpy arrays?

我有一個3D(時間,X,Y)numpy數組,包含6個小時的時間序列幾年。 (比如5)。 我想創建一個采樣時間序列,其中包含從可用記錄中隨機抽取的每個日歷日的1個實例(每天5種可能性),如下所示。

  • 1月01日:2006年
  • 1月02日:2011年
  • 1月03日:2009年
  • ...

這意味着我需要從01/01/2006獲取4個值,從2011年2月1日起獲取4個值等。我有一個工作版本,其工作方式如下:

  • 重塑輸入數組以添加“年”維度(時間,年份,X,Y)
  • 創建一個隨機生成的0到4之間整數的365值數組
  • 使用np.repeat和整數數組僅提取相關值:

例:

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

這似乎有效,但我想知道這是否是解決我問題的最佳/最快方法? 速度很重要,因為我在循環中這樣做,adn將受益於測試盡可能多的情況。

我這樣做了嗎?

謝謝

編輯我忘了提到我過濾了輸入數據集以刪除閏年的第29個。

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

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到365),並選擇具有索引的切片,例如, n*365 + offset

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM