Найти индексы элементов, больших x

Учитывая следующий вектор,

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

Мне нужно идентифицировать индексы «a», элементы которых> = 4, например:

 idx = [3, 4, 5, 6, 7, 8] 

Информация в «idx» будет использоваться для удаления элементов из другого списка X (X имеет такое же количество элементов, что и «a»):

 del X[idx] #idx is used to delete these elements in X. But so far isn't working. 

Я слышал, что numpy может помочь. Есть идеи? Благодаря!

    5 Solutions collect form web for “Найти индексы элементов, больших x”

    Хорошо, я понимаю, что вы имеете в виду, и одной строки Python будет достаточно:

    использование списка

     [ j for (i,j) in zip(a,x) if i >= 4 ] # a will be the list compare to 4 # x another list with same length Explanation: >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> x ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j'] 

    Функция Zip вернет список кортежей

     >>> zip(a,x) [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g'), (8, 'h'), (9, 'j')] 

    Сопоставление списков – это ярлык для циклирования элемента над списком, который после «in», и оценивает элемент с выражением, затем возвращает результат в список, также вы можете добавить условие, по какому результату вы хотите вернуть

     >>> [expression(element) for **element** in **list** if condition ] 

    Этот код ничего не делает, кроме как вернуть все пары, которые были заархивированы.

     >>> [(i,j) for (i,j) in zip(a,x)] [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e'), (6, 'f'), (7, 'g'), (8, 'h'), (9, 'j')] 

    Мы делаем это, добавляя к нему условие, указывая «if» следующим логическим выражением

     >>> [(i,j) for (i,j) in zip(a,x) if i >= 4] [(4, 'd'), (5, 'e'), (6, 'f'), (7, 'g'), (8, 'h'), (9, 'j')] 

    с использованием Itertools

     >>> [ _ for _ in itertools.compress(d, map(lambda x: x>=4,a)) ] # a will be the list compare to 4 # d another list with same length 

    Используйте itertools.compress с одной строкой в Python, чтобы закрыть эту задачу.

     >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> d = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j'] # another list with same length >>> map(lambda x: x>=4, a) # this will return a boolean list [False, False, False, True, True, True, True, True, True] >>> import itertools >>> itertools.compress(d, map(lambda x: x>4, a)) # magic here ! <itertools.compress object at 0xa1a764c> # compress will match pair from list a and the boolean list, if item in boolean list is true, then item in list a will be remain ,else will be dropped #below single line is enough to solve your problem >>> [ _ for _ in itertools.compress(d, map(lambda x: x>=4,a)) ] # iterate the result. ['d', 'e', 'f', 'g', 'h', 'j'] 

    Объяснение для itertools.compress, я думаю, это будет понятно для вашего понимания:

     >>> [ _ for _ in itertools.compress([1,2,3,4,5],[False,True,True,False,True]) ] [2, 3, 5] 
     >>> [i for i,v in enumerate(a) if v > 4] [4, 5, 6, 7, 8] 

    enumerate возвращает индекс и значение каждого элемента в массиве. Поэтому, если значение v больше 4 , включите индекс i в новый массив.

    Или вы можете просто изменить свой список на месте и исключить все значения выше 4 .

     >>> a[:] = [x for x in a if x<=4] >>> a [1, 2, 3, 4] 
     >>> import numpy as np >>> a = np.array(range(1,10)) >>> indices = [i for i,v in enumerate(a >= 4) if v] >>> indices [3, 4, 5, 6, 7, 8] >>> mask = a >= 4 >>> mask array([False, False, False, True, True, True, True, True, True], dtype=boo l) >>> a[mask] array([4, 5, 6, 7, 8, 9]) >>> np.setdiff1d(a,a[mask]) array([1, 2, 3]) 

    использование встроенной функции фильтра прекрасное

     >>>a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>>filter(lambda x : x < 4, a) [1, 2, 3] 

    объяснение

    фильтр (FUN, Iterable)

    это выражение будет перебирать все элементы из Iterable и поставлять функции FUN в качестве аргумента, если return is True, тогда adrugment будет добавляться во внутренний список

    lambda x: x> 4

    это означает анонимную функцию, которая будет принимать аргумент и проверять его, если оно больше 4, и вернуть значение True из False

    Ваше решение

    если вы пытаетесь удалить все элементы размером более 4, попробуйте выполнить удар

     >>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> filter(lambda x: x<4 ,a) [1, 2, 3] 

    Самое простое в моих глазах – использовать numpy

     X[np.array(a)>4]#X needs to be np.array as well 

    Объяснение: np.array преобразует a в массив.

    np.array (a)> 4 дает массив bool со всеми элементами, которые должны быть сохранены

    И X фильтруется массивом bool, поэтому выбираются только элементы, где a больше 4 (и остальные отбрасываются)

    Python - лучший язык программирования в мире.