web-dev-qa-db-ja.com

xより大きい要素のインデックスを見つける

次のベクトルを考えると、

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

次のように、要素が4以上である「a」のインデックスを識別する必要があります。

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が役立つかもしれないと聞きました。何か案は?ありがとう!

20
Oliver Amundsen

OK、私はあなたの意味を理解し、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を単一行 in 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]
15
Shawn Zhang
>>> [i for i,v in enumerate(a) if v > 4]
[4, 5, 6, 7, 8]

enumerateは、配列内の各アイテムのインデックスと値を返します。したがって、値v4より大きい場合、インデックスiを新しい配列に含めます。

または、リストを変更して、4より上のすべての値を除外することもできます。

>>> a[:] = [x for x in a if x<=4]
>>> a 
[1, 2, 3, 4]
26
Aesthete
>>> 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])
6
Joran Beasley

私の目に最も簡単なのは、numpyを使用することです

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

説明:np.arrayはaを配列に変換します。

np.array(a)> 4は、保持する必要があるすべての要素を含むブール配列を提供します

また、Xはブール配列によってフィルタリングされるため、aが4より大きい要素のみが選択されます(残りは破棄されます)。

4
Okapi575

フィルターの組み込み関数を使用しても問題ありません

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

説明

フィルター(FUN、反復可能)

この式は、Iterableからすべての要素を繰り返し、引数としてFUN関数に提供します。returnがTrueの場合、arugmentは内部リストに追加されます

ラムダ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]
1
Shawn Zhang