Извлечение определенных условий / значений внутри цикла - PullRequest
1 голос
/ 25 октября 2019

У меня есть набор данных, который я разработал, используя цикл (код ниже).

## A subset of the data
deficit = (E_daily[:,160,100] - P_daily[:,160,100])  # A view of `deficit` is given below
deficit_cum = np.zeros([365])   
start = 0
stop = 0
for i in range(365):
    deficit_cum[i] = deficit[i] + deficit_cum[i-1]
    if deficit_cum[i] >= 0:
        if np.nanmax(deficit_cum) <= deficit_cum[i]:
            stop = i
        else:
            continue
    else:
        deficit_cum[i] = 0
        if np.nanmax(deficit_cum) > deficit_cum[i]:
            continue
        else:
            start = i     #Start is not defined correctly by me

Так выглядит deficit перед циклом enter image description here

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

enter image description here

На рисунке выше зеленая линия определяет start(ось X) и красная линия определяют stop (ось X) из кода. Поэтому я хочу, чтобы максимальное значение было моим stop баллом. Но я хочу, чтобы мой start был меньше, чем стоп, и не должно быть никаких отрицательных точек между start и stop. Так что для диаграммы ниже мой start должен быть около 111, а stop должен быть около 236.

Я думаю, что знаю, как получить stop (код выше), ноУ меня все еще проблемы с определением start. [Дополнительная информация: My start должно быть индексом последнего нуля перед глобальным максимумом, а stop должно быть индексом глобального максимума]

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Итак, у вас есть список, и вы хотите найти min перед max с именами start и stop, предполагая, что в списке с именами a вы можете использовать argmax и argminфункции, поэтому мы имеем:

import numpy as np

a = np.array([1,2,3,6,6,6,4,5])
start = np.argmin(a)

b = np.where(a==a.max()) # find indices in which max values exist
b = np.reshape(b,-1)
new_array = a[:b[-1]+1] # make a new array, it starts from 0 to index of last max value
# new_array = = [1,2,3,6,6,6]

c = np.where(new_array==new_array.min())
c = np.reshape(c,-1)

start = c[-1]
stop = b[-1]
0 голосов
/ 25 октября 2019

Хорошо, давайте попробуем что-то вроде этого.

Сначала мы вычислим дефицит.

deficit = np.absolute(E_daily[:,160,100] - P_daily[:,160,100])
deficit_cum = np.cumsum(deficit)

Начальный индекс - это где день> день - 1, и наоборот для остановки.

start = np.where(np.diff(deficit) > 0)[0][0] + 1
stop = np.where(np.diff(defict[start:]) < 0)[0][0] + 2

Давайте посмотрим на это в действии.

deficit = np.array([1,1,2,3,6,6,6,4,5])
start = np.where(np.diff(deficit) > 0)[0][0] + 1
stop = np.where(np.diff(defict[start:]) < 0)[0][0] + 2

Результаты

start = 2 # deficit[2] == 2
stop = 6 # deficit[6] == 6

Документы

Примечание

AsВы использовали NumPy, вы должны думать с матрицами, и забыть о цикле. Это хорошая практика, чтобы использовать встроенную функцию NumPy для выполнения операции. Это быстрее, а также воспроизводимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...