Подтвердить что ты не робот

Найти индексы элементов, больших 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 может помочь. Есть идеи? Спасибо!

4b9b3361

Ответ 1

ОК, я понимаю, что вы имеете в виду, и одной строки 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')]

List comprehension - это ярлык для циклирования элемента над списком, который после "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')]

Что мы делаем, так это добавить к нему условие, указав "если" следовать логическому выражению

>>> [(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]

Ответ 2

>>> [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]

Ответ 3

>>> 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])

Ответ 4

Простейшим в моих глазах будет использование 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 (и остальные отбрасываются)

Ответ 5

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

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

Объяснение

фильтр (FUN, Iterable)

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

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]

Ответ 6

Думаю, я пришел сюда немного поздно (хотя с Numpy все стало проще)..

import numpy as np

# Create your array
a = np.arange(1, 10)
# a = array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# Get the indexes/indices of elements greater than 4 
idx = np.where(a > 4)[0]
# idx = array([4, 5, 6, 7, 8])

# Get the elements of the array that are greater than 4
elts = a[a > 4]
# elts = array([5, 6, 7, 8, 9])

# Convert idx(or elts) to a list
idx = list(idx)
#idx = [4, 5, 6, 7, 8]