Оконный выбор из списка в Python - PullRequest
0 голосов
/ 14 января 2019

Предположим, у меня есть список

a=[0,1,2,3,4,5,6,7,8,9]

Я случайным образом выбираю индекс, используя

i = np.random.choice(np.arange(a.size))

и теперь я хочу выбрать симметричный интервал вокруг i некоторого размера, скажем 2. Так, например, для данного списка, если выбран индекс i = 5, я получаю что-то вроде

print(a[i-2:i+2+1])
>> [3, 4, 5, 6, 7]

Это отлично работает однако, если я окажусь рядом с одной из конечных точек, i = 1. Используя то, что у меня есть,

print(a[i-2:i+2+1])
>> []

Вместо этого я хочу что-то напечатать асимметричный интервал, например [0, 1, 2, 3]

если я = 8

print(a[i-2:i+2+1])
>> [6, 7, 8, 9] 

как будто я тоже этого хочу, так что, похоже, близость к конечной точке не имеет значения. Самое близкое к решению, которое я получил (скажем, для i = 1)

print([a[0:i+3] if a[i-2:i+2+1] == [] else a[i-2:i+2+1] ])
>> [[0, 1, 2, 3]]

Но это возвращается, [[0,1,2,3]] вместо [0,1,2,3]

Есть ли хороший способ сделать это в python / numpy, используя понимание списка или что-то еще?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Вы наткнулись на правую нумерацию Python. Вы дали ему пределы [-1: 3], но -1 обозначает правый элемент. Так как «первый» элемент проходит после «последнего» элемента, результирующий срез равен 0. У вас не будет этой проблемы при высоких индексах, потому что на этом конце нет «обтекания».

Просто приведите нижний указатель к рейке 0, используя max.

print(a[max(i-2, 0)]:i+2+1])
0 голосов
/ 15 января 2019

Проблема в том, что при выходе из границ списка он возвращает пустой список. Попробуйте:

a=[0,1,2,3,4,5,6,7,8,9]
i = 1
interval=2
print( a[ max(i-2, 0) : min(i+2+1, len(a)) ] )

Я просто наложил максимальные / минимальные ограничения, чтобы он не избежал этого. Не очень питонно, но это быстрое решение.

0 голосов
/ 15 января 2019

Вам просто нужно обрезать нижний индекс на ноль:

>>> print(a[max(i-2,0):i+2+1])
[0, 1, 2, 3]

Без этого он может попасть в отрицательные числа. Это имеет особое значение при нарезке: отрицательные индексы отсчитываются от конца списка.

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