Оценка элементов массива с обратной - PullRequest
2 голосов
/ 06 декабря 2011

Я все еще очень плохо знаком с питоном и программированием и пытаюсь понять, правильно ли я решаю эту проблему.Я склонен использовать подход matlab к вещам, но здесь я просто изо всех сил ...

Контекст: у меня есть два пустых массива, нанесенных в это изображение на flickr , так как я не могу опубликоватьфотографии здесь :(. Они имеют свойства одинаковой длины (оба 777x1600), и я пытаюсь использовать красный массив, чтобы помочь вернуть индекс (значение на оси X графика) и значение элемента (ось Y)точка на голубом графике, обозначенная стрелкой для каждой строки синего массива.

Передо мной была поставлена ​​задача: а) определить максимальное значение красного массива (обозначенного красной точкой на рисунке иуже выполнено)

и b) начать с конца синего массива с последним элементом и считать в обратном порядке, сравнивая элемент с предыдущим элементом.Цель состоит в том, чтобы определить, где уменьшается предыдущее значение.(например, когда элемент -1 больше элемента -2, указывает на последний пик на изображении).Кроме того, чтобы предотвратить выбор «шума» в конце раздела с повышенными значениями, мне также нужно ограничить выбранное значение большим, чем максимум красного массива.

Вот что я получилпока, но я застрял на второй строке, где мне нужно оценить выбранную строку массива от позиции (-1) в строке до начала или (0) позиции:

for i,n in enumerate(blue):  #select each row of blue in turn to analyze
    for j,m in enumerate(n):  #select each element of blue ??how do I start from the end of array and work backwards??
        if m > m-1 and m > max_val_red[i]:
        indx_m[i] = j
        val_m[i] = m

Ответы [ 3 ]

2 голосов
/ 06 декабря 2011

Чтобы ответить на ваш вопрос напрямую, вы можете использовать n [:: - 1] для реверса массива n.

Итак, код:

for j, m in enumerate(n[::-1]):
    j = len(n)-j-1
    # here is your code

Но для увеличения скорости вычисления, вы должны избегать цикла Python:

import numpy as np
n = np.array([1,2,3,4,2,5,7,8,3,2,3,3,0,1,1,2])

idx = np.nonzero(np.diff(n) < 0)[0]
peaks = n[idx]
mask = peaks > 3 # peak muse larger than 3

print "index=", idx[mask]
print "value=", peaks[mask]

вывод:

index= [3 7]
value= [4 8]
1 голос
/ 06 декабря 2011

Полагаю, вы имеете в виду:

if m > n[j-1] and m > max_val_red[i]:
    indx_m[i] = j
    val_m[i] = m

потому что m > m - 1 всегда верно

Чтобы повернуть массив на оси, вы можете индексировать массив, используя ::-1 на этой оси, например, чтобы изменить синий цвет на оси 1, вы можете использовать:

blue_reverse = blue[:, ::-1]

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

threshold = red.max(1)
threshold = threshold[:, np.newaxis] #this makes threshold's shape (n, 1)

blue = blue[:, ::-1]
index_from_end = np.argmax((blue[:, :-1] > blue[:, 1:]) & (blue[:, :-1] > threshold), 1)
value = blue[range(len(blue)), index_from_end]
index = blue.shape[1] - 1 - index_from_end
0 голосов
/ 06 декабря 2011

Извините, я не прочитал все это, но вы можете посмотреть на встроенную функцию в обратном порядке.поэтому вместо перечисления (n).Вы можете сделать обратное (перечислить (n)).Но тогда ваш индекс будет неправильным, правильный индекс будет равен len (n) - j

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