Какой самый быстрый способ сэмплировать фрагменты массивов? - PullRequest
5 голосов
/ 21 октября 2011

У меня есть 3D-массив (время, X, Y), содержащий 6 часовых временных рядов в течение нескольких лет.(скажем 5).Я хотел бы создать выборочный временной ряд, содержащий 1 экземпляр каждого календарного дня, случайным образом взятый из доступных записей (5 вариантов в день), следующим образом.

  • 01 января: 2006
  • 02 января 2011 года
  • 03 января 2009 года
  • ...

это означает, что мне нужно взять 4 значения с 01.01.2006, 4 значенияот 01.02.2011 и т. д. У меня есть рабочая версия, которая работает следующим образом:

  • Изменение формы входного массива для добавления измерения "год" (Время, Год, X, Y)
  • Создайте массив из 365 значений случайно сгенерированных целых чисел от 0 до 4
  • Используйте np.repeat и массив целых чисел, чтобы извлечь только соответствующие значения:

Пример:

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

Кажется, это работает, но мне было интересно, если это лучший / самый быстрый подход для решения моей проблемы?Скорость важна, так как я делаю это в цикле, и ADN выиграет от тестирования как можно большего числа случаев.

Правильно ли я делаю это?

Спасибо

EDIT Я забыл упомянуть, что отфильтровал входной набор данных, чтобы удалить 29-е февраля для високосных лет.

По сути, цель этой операции - найти выборку за 365 дней, которая хорошо соответствует долгосрочному периоду.временные ряды в терминах среднего значения и т. д. Если отобранные временные ряды проходят мой тест качества, я хочу экспортировать их и начать заново.

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

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 голосов
/ 21 октября 2011

Я не вижу реальной необходимости изменять форму массива, поскольку вы можете встроить информацию о размере года в процесс выборки и оставить массив в его первоначальной форме.

Например, вы можетесгенерируйте случайное смещение (от 0 до 365) и выберите фрагмент с индексом, скажем, n*365 + offset.

В любом случае, я не думаю, что ваш вопрос завершен, потому что я не совсем понял, чтовам нужно сделать, или почему.

...