Поиск вариаций между каждым элементом в списке - PullRequest
1 голос
/ 14 июля 2020

У меня есть следующий массив:

list1 = [2.11e-06, 2.03e-06, 2.24e-06, 2.04e-06, 3.01e-06, 1.62e-06, 1.82e-06, 1.67e-06, 1.75e-06, 1.67e-06, 1.71e-06, 1.69e-06, 1.87e-06, 1.75e-06, 1.75e-06, 1.75e-06, 1.85e-06, 1.75e-06, 2.03e-06, 1.78e-06, 1.93e-06, 1.75e-06, 1.75e-06, 1.75e-06, 2.19e-06, 2.28e-06, 2.13e-06, 2.92e-06, 2.14e-06, 2.24e-06, 2.06e-06, 2.21e-06, 2.17e-06, 2.17e-06, 2.41e-06, 2.41e-06, 2.03e-06, 2.42e-06]

Я пытаюсь получить новый массив, где каждый элемент является вариацией между элементом и его следующим элементом. Так, например, если у меня есть [1, 2, 1], мне нужно получить: [100, -50].

Вот что я пробовал:

for x in list1[1:]:
    PreviousIndex = list1.index(x)-1
    Variation = ((x - list1[PreviousIndex])/list1[PreviousIndex])*100
    NewArr.append(Variation)

Что даст следующий результат:

[-12.8099173553719, -3.7914691943128, 10.344827586206902, -8.928571428571438, 47.54901960784314, -46.179401993355484, 12.345679012345679, -8.241758241758234, 4.790419161676638, -8.241758241758234, 2.395209580838313, -1.1695906432748548, 10.650887573964509, 4.790419161676638, 4.790419161676638, 4.790419161676638, 5.714285714285721, 4.790419161676638, -3.7914691943128, -12.315270935960598, 8.426966292134846, 4.790419161676638, 4.790419161676638, 4.790419161676638, 25.142857142857157, 4.109589041095889, -6.578947368421064, 37.08920187793427, -26.712328767123296, 10.344827586206902, -8.035714285714283, 7.281553398058244, -1.8099547511312237, -1.8099547511312237, 11.059907834101375, 11.059907834101375, -3.7914691943128, 19.211822660098527]

Проблема с этой реализацией заключается в том, что в определенный момент у меня есть, на list1, два последовательных одинаковых элемента 1.75e-06, 1.75e-06, поэтому я должен получить 0.0 Вариант, но я его не понимаю. . Кто-нибудь знает более плавную реализацию этой простой проблемы?

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Проблема в том, что list1.index(x) - это индекс первого появления x в списке. Если у вас есть повторы, следующие значения получат индекс первого значения, и вы будете использовать предшественника этого первого значения несколько раз.

Вместо этого вы можете просто перечислить массив по индексу.

list1 = [2.11e-06, 2.03e-06, 2.24e-06, 2.04e-06, 3.01e-06, 1.62e-06, 1.82e-06,
    1.67e-06, 1.75e-06, 1.67e-06, 1.71e-06, 1.69e-06, 1.87e-06, 1.75e-06, 
    1.75e-06, 1.75e-06, 1.85e-06, 1.75e-06, 2.03e-06, 1.78e-06, 1.93e-06, 
    1.75e-06, 1.75e-06, 1.75e-06, 2.19e-06, 2.28e-06, 2.13e-06, 2.92e-06, 
    2.14e-06, 2.24e-06, 2.06e-06, 2.21e-06, 2.17e-06, 2.17e-06, 2.41e-06, 
    2.41e-06, 2.03e-06, 2.42e-06]

NewArr = []

for i in range(len(list1) -1 ):
    prev = list1[i]
    cur = list1[i+1]
    Variation = ((cur-prev)/prev)*100
    NewArr.append(Variation)

for i, item in enumerate(NewArr):
    print(i, item)

Вы также можете сделать это с помощью numpy, который будет применять операции ко всем массивам за один шаг:

arr = np.array(list1)
cur = arr[1:]
prev = arr[:-1]
new_arr = ((cur-prev)/prev) * 100
1 голос
/ 14 июля 2020

Мы можем использовать zip для обхода списка и использования понимания списка для получения следующего результата:

list1 = [2.11e-06, 2.03e-06, 2.24e-06, 2.04e-06, 3.01e-06, 1.62e-06, 1.82e-06, 1.67e-06, 1.75e-06, 1.67e-06, 1.71e-06, 1.69e-06, 1.87e-06, 1.75e-06, 1.75e-06, 1.75e-06, 1.85e-06, 1.75e-06, 2.03e-06, 1.78e-06, 1.93e-06, 1.75e-06, 1.75e-06, 1.75e-06, 2.19e-06, 2.28e-06, 2.13e-06, 2.92e-06, 2.14e-06, 2.24e-06, 2.06e-06, 2.21e-06, 2.17e-06, 2.17e-06, 2.41e-06, 2.41e-06, 2.03e-06, 2.42e-06]

result = [(b - a)/a*100 for a, b in zip(list1[::], list1[1::])]
print(result)

Результат будет:

[-3.7914691943128, 10.344827586206902, -8.928571428571438, 47.54901960784314, -46.179401993355484, 12.345679012345679, -8.241758241758234, 4.790419161676638, -4.571428571428564, 2.395209580838313, -1.1695906432748548, 10.650887573964509, -6.417112299465247, 0.0, 0.0, 5.714285714285721, -5.405405405405411, 16.000000000000004, -12.315270935960598, 8.426966292134846, -9.32642487046633, 0.0, 0.0, 25.142857142857157, 4.109589041095889, -6.578947368421064, 37.08920187793427, -26.712328767123296, 4.672897196261697, -8.035714285714283, 7.281553398058244, -1.8099547511312237, 0.0, 11.059907834101375, 0.0, -15.767634854771776, 19.211822660098527]

Я думаю в [1, 2, 1] результат будет [100.0, -50.0], а не [100.0, -100.0]. Пожалуйста, дайте отзыв, чтобы внести исправления, если я ошибался

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