Python выбор ближайших отрицательных и положительных значений к нулю из списка - PullRequest
0 голосов
/ 17 февраля 2020

У меня много списков. Каждый список содержит три числа. Мне нужно выбрать отрицательный и положительный ближайший к нулю из каждого списка. Вот пример:

list1= [-18.987536121749894, 9.154936510174036, -4.626424654409895]     
list2= [-4.626424654409895, 9.154936510174036, 2.355498340416582]     
list3= [-0.5, 0.1, 0.005] 

Мой ожидаемый результат:

list1_op= [-4.626424654409895, 9.154936510174036]     
list2_op= [-4.626424654409895, 2.355498340416582]     
list3_op= [-0.5, 0.005] 

Мой код:

while loop: 
     ...
     ...
    pdif = fun(mf1,mf2,mf3)   # mf1 and mf2 are extreme points, mf3 is middle point between them
    asign = np.sign(pdif) # check for sign change in Pdif list  
    signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
    print(pdif)
    if abs(pdif[2])<0.01:
        print("Optimal point reached")
        break
    else:
        if signchange.sum()>0: # If yes then there is a merging point
            if (pdif[2]<abs(pdif[0]))&(signchange[1]==1):
                mf1 = mf3
            elif (pdif[2]<abs(pdif[1]))&(signchange[2]==1):
                mf2 = mf3
            mf3 = np.array([mf1,mf2]).mean() 

Я понятия не имею, как начать.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Найти наибольшее число меньше нуля и наименьшее число больше нуля.

import numpy as np
a = [-18.987536121749894, 9.154936510174036, -4.626424654409895]     
b = [-4.626424654409895, 9.154936510174036, 2.355498340416582]     
c = [-0.5, 0.1, 0.005] 
for thing in (a,b,c):
    thing = np.array(thing)
    x = thing[thing<0].max()
    y = thing[thing>0].min()
    ix = np.where(np.isclose(thing,x))[0]
    iy = np.where(np.isclose(thing,y))[0]
    print(f'{x},{y},{ix},{iy}')
    # or
    indices = np.where(np.any(np.isclose(thing[:,None],[x,y]),axis=-1))
    print(f'indices:{indices[0]}')

Будет выдано значение ValueError, если в тестируемом списке нет положительных или отрицательных чисел.

1 голос
/ 17 февраля 2020
output_list = [None]*len(lists)    

for i in len(lists):
    list = lists[i]
    smallest_positive = list[list>0].min()
    biggest_negative = list[list<0].max()
    output_list[i] = (smallest_positive, biggest_negative)
return output_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...