Python - Определить точку перегиба в списке и заменить - PullRequest
0 голосов
/ 10 марта 2020

Название на самом деле вводит в заблуждение, но я не знал, как описать мою проблему в коротком предложении. Меня не волнует точка перегиба, но мне важна точка, в которой значения переключаются с x> 1 на x <1. </p>

Рассмотрим следующий массив:

a = np.array([0.683, 0.819, 0.678, 1.189, 1.465, 0.93 , 0.903, 1.321, 1.321, 0.785, 0.875])

# do something... and here's what I want:

np.array([True, False, False, False, False, True, True, False, False, True, True])

Вот правила:

  1. Первая точка в массиве является начальной точкой и всегда помечена как True
  2. Чтобы значения были помечены True, она должна быть меньше 1 ( x <1). </li>
  3. Однако, даже если значение меньше 1, если оно находится между первым значением меньше 1 и первым значением больше 1, пометьте его как False.

Если мое объяснение не имеет смысла, вот картина того, что я хочу сделать:

enter image description here

Десятичные значения в массив a - это просто rat ios: текущая точка / предыдущая точка. Как я могу сделать это в Python?

1 Ответ

1 голос
/ 11 марта 2020

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

import numpy as np
a = np.array([0.683, 0.819, 0.678, 1.189, 1.465, 0.93 , 0.903, 1.321, 1.321, 0.785, 0.875])

### if a number is below ONE but in a position between the first true below zero and the first false above zero
### then it's false

## find the two indexes of the first value below 1 and the first value above 1
def find_indx(a):

    first_min=0
    for i in range(len(a)):
        if(a[i]<1):
            first_min=i
            break
    first_max=0
    for i in range(len(a)):
        if(a[i]>1):
            first_max=i
            break
    return([first_min,first_max])

Используя эту функцию, вы можете установить в false значения, которые ниже нуля, но находятся в интервале между первым ниже нуля и первым выше нуля. Два индекса хранятся в «false_range».

Как только вы это сделаете, это довольно просто. Первый пункт всегда верен. Если индексы находятся между «false_range» и ниже нуля, они становятся ложными. Если точки находятся за пределами «ложного диапазона», их значение зависит от того, превышают они 1 или ниже.

false_range=find_indx(a)

truth_list=[]
for i in range(len(a)):
    ## the first value is always true
    if(i==0):
        truth_list.append(True)
    else:
        ## if the index is between the false_range and 
        ## this value is below 1 assign False
        if(i>false_range[0] and i<false_range[1] and a[i]<1):
            truth_list.append(False)
        ## in all the other cases it depends only if the value is below or above zero
        elif(a[i]>1):
            truth_list.append(False)
        elif(a[i]<1):
            truth_list.append(True)


print(truth_list)

[True, False, False, False, False, True, True, False, False, True, True]

Распечатанный список соответствует тому, который вы дали, но, пожалуйста, проверьте это решение перед его использованием.

...