2012-03-27 8 views
5

Python3/Numpyに配列をフィルタリングし、残っている要素のインデックスを返す組み込み関数がありますか?ソートのためにnumpy.argsortと似たもの。私が持っているフィルターは、最小値と最大値の両方を設定しています - 最小値/最大値より下/上のすべての値を除外しなければなりません。Python3/Numpyで配列をフィルタリングしてインデックスを返す

私はPythonの関数filterを見ましたが、それを使ってインデックスを抽出する方法はありません。

EDITED:回答に役立つ情報がたくさんあります。ありがとうございました!

@SvenMarnachが指摘したように、マスクは十分です:

mask = (min_value < a) & (a < max_value) 

は今、私はaと同じ形状の他の配列に、このマスクを適用する必要がありますが、確かではない、それを行うための最善の方法は何ですか。 ..

答えて

4

あなたが

indices = ((min_value < a) & (a < max_value)).nonzero()[0] 
max_valueより min_valueとレよりも大きい1次元配列 a内の要素のインデックスを取得することができます0

通常あなたがが、これらの指標を必要としませんが、あなたはマスク

mask = (min_value < a) & (a < max_value) 

をより効率的に作業することができます。このマスクはaと同じ形状を持つブール配列です。

編集:あなたはaと同じ形状の配列bを持っている場合は、あなたが

b[mask] 
+0

素晴らしい!迅速な返信をありがとう。実際、マスクで十分ですが、このマスクを 'a'と同じ形状の他の配列にどのように適用すればよいですか? – Katya

+0

@Katyaどういう意味ですか?特定のマスクを持つ5×5アレイがある場合、4×3または6×6アレイに適用することを意味するものを定義できますか? – Hooked

+0

@Katya:「このマスクを適用する」とはどういう意味ですか?対応する要素を抽出しますか?私はその目的のために私の答えに文を追加しました。 –

4

コマンドあなたの後numpy.wherewill return the indices of an arraymaskTrueのエントリに対応するbの要素を抽出することができます」それらの上にマスクを適用しました。たとえば:

import numpy as np 
A = np.array([1,2,3,6,2]) 
np.where(A>2) 

ができます:

(array([2, 3]),) 

Aより複雑な例:

A = np.arange(27).reshape(3,3,3) 
np.where((A>10) & (A<15)) 

が与える:

(array([1, 1, 1, 1]), array([0, 1, 1, 1]), array([2, 0, 1, 2])) 

私はあなたに、通常、@SvenMarnachに同意しますdo not neインデックス

+0

私はこれを見たときに自分のバージョンの 'where'を作成しました。一口。 – senderle

+0

@sendleおそらく遅いです。私が「numpy/scipy」のフルパワーを知っていると思うたびに、このサイトは私が間違っていることを示しています。 – Hooked

1

私はSvenの回答がたくさんありますが、実際には、numpy.whereはあなたが望むものを正確に行います。フックドは私に思い出させてくれました。しかし、主に私がすでにそれを書いているので、ここに別のアプローチがあり、ちょっとしたトリックを説明するだけです。例えば

def my_filter(a): 
    return (10 < a) & (a < 40) 

a_mask = my_filter(a) 
indices = [ind[a_mask] for ind in numpy.indices(a.shape)] 

my_filterは、入力と同じ形状のブール配列を返す任意の関数とすることができる

>>> a = numpy.arange(100).reshape((10, 10)) 
>>> def my_filter(a): 
...  return (min_value < a) & (a < max_value) 
... 
>>> a_mask = my_filter(a) 
>>> [ind[a_mask] for ind in numpy.indices(a.shape)] 
[array([1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
     3, 3, 3, 3, 3, 3]), 
array([1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 
     4, 5, 6, 7, 8, 9])] 
4

直接あなたの質問に関連していないが、filter()は3のセットの一部でありますPythonで機能的なスタイルのリスト処理を許可する機能、map()filter()、およびreduce()、。

  • map(mapping_function, input_list)順番にリストの各要素に関数を適用し、一つの引数リストの機能を取り込み、その結果、出力リストを返します。これは、リストの理解[mapping_function(item) for item in input_list]とほぼ同等です。

  • filter(filter_function, input_list)filter_functionが返されたinput_listの要素のリストを返します。Trueです。リスト理解度は[item for item in items if filter_function(item)]です。

  • reduce(combining_function, input_list)一つの値だけが残されるまで繰り返し入力リスト中の要素の隣接する対を結合します。例えば、数字のリストの合計は、reduce(operator.add, numbers)と表すことができます。

map()filter()の機能は、(mapfilter機能が非常に頻繁に使用されていない理由である。)Pythonでリストの内包によって提供され

reduce()は「doesnのものの一つであります直感的な答えとして自分自身を提案する...何か。ループを書くことはほとんどいつも明白です。なぜそれが頻繁に見られないのか説明しています。

関連する問題