Среднее и стандартное отклонение для нескольких массивов с использованием NumPy - PullRequest
0 голосов
/ 07 декабря 2018

Я импортирую данные двумерной матрицы для многолетних испытаний климатических временных рядов на 5-летнем годовом наборе данных.Я создал цикл for для импорта двумерных матричных данных по годам в серию из 5 отдельных массивов размера (1500, 3600).Я добавляю данные временных рядов матрицы в один объединенный (5, 1500, 3600) массив, где каждый год является одним измерением в массиве.Затем я запускаю np.mean и np.std для создания (1500, 3600) матриц, вычисляющих среднее значение за 5 лет и стандартное значение данных в каждой точке матрицы.Код ниже.Цифры выглядят правильно, когда я проверяю это, но я хотел бы знать ..

Есть ли более быстрый способ сделать это?В конечном счете мне потребуется выполнить этот тип анализа для ежедневных данных в течение 18 временных интервалов, которые будут строиться и работать на массиве (6570, 1500, 3600).Какие-либо предложения?Я довольно новичок в Python и все еще нахожу свой путь.

StartYear=2009
EndYear=2014
for x in range(StartYear, EndYear):
    name = "/dir/climate_variable" + str(x) + ".gz"
    Q_WBM = rg.grid(name)
    Q_WBM.Load()
    q_wbm = Q_WBM.Data  # .flatten()
    q_wbm[np.isnan(q_wbm)] = 0
    if x == StartYear:
        QTS_array = q_wbm
    else:
        QTS_array = np.append(QTS_array, q_wbm, axis=0)

DischargeMEAN = np.mean(QTS_array, axis=0)
DischargeSTD = np.std(QTS_array, axis=0)

1 Ответ

0 голосов
/ 07 декабря 2018

В отличие от list.append, который амортизируется, O (1) numpy.append в значительной степени равен O (n), т. Е. Ваш цикл равен O (n ^ 2), и его будет бесполезно использовать в полной задаче.

Кроме того, 6570 x 1500 x 3600 x itemsize на самом деле довольно большой и не уместится в память, если у вас его много.

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

    if x == StartYear:
        mom1 = q_wbm
        mom2 = q_wbm**2
    else:
        mom1 += q_wbm
        mom2 += q_wbm**2

DischargeMEAN = mom1 / n
DischargeSTD = np.sqrt(mom2 / n - DischargeMEAN**2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...