2016-04-04 11 views
0

私は3列とN要素(この例では4)を持つ行列x_facesを持っています。行当たり 私はそれが配列matches行列の要素の配列を一致させる

この返す必要があります
x_faces = [[ 0, 43, 446], 
      [ 8, 43, 446], 
      [ 0, 10, 446], 
      [ 0, 5, 425] 
      ] 
matches = [8, 10, 44, 425, 440] 

からのいずれかの要素が含まれているかどうかを知りたい:私はこれを行うためのループを考えるが、そこにあることができ

results = [ 
     False, 
     True, 
     True, 
     True 
    ] 

をPythonでこれを行うきちんとした方法は?

+0

'' reshape(-1,3)、axis = 1) ' – bl3nd3d

答えて

2

あなたは、その目的のために​​機能を使用することができます。

result = [any(x in items for x in matches) for items in x_faces] 

出力:

[False, True, True, True] 
+0

これは内部的にforループと実際に異なるのですか?リストの理解は、より良い見栄えのために、より効果的なものになるためにいくつかの魔術師をしていますか? 編集:ああ、 'any'の中のものはジェネレータ式ですよね? – Ilja

+0

Python3のバージョンでは代わりに['any'](https://docs.python.org/3.4/library/functions.html#any)にリンクするべきだと思います –

+0

ありがとう、any()関数は私が探していたものでした – bl3nd3d

0

あなたがnumpyの使用と3Dの両方の配列を変換し、それらを比較することができます。それから私は、最後の2つの軸での値のいずれかが真であるかどうか、判断するために合計を使用します。

x_faces = np.array([[ 0, 43, 446], 
      [ 8, 43, 446], 
      [ 0, 10, 446], 
      [ 0, 5, 425] 
      ]) 
matches = np.array([8, 10, 44, 425, 440]) 
shape1, shape2 = x_faces.shape, matches.shape 
x_faces = x_faces.reshape((shape1 + (1,))) 
mathes = matches.reshape((1, 1) + shape2) 
equals = (x_faces == matches) 
print np.sum(np.sum(equals, axis=-1), axis=-1, dtype=bool) 
+0

の場合は、このタスクのためのリリトルオーバーヘッドではありません.. –

+0

多分:)サイズに依存します。私はあなたがしていることがforループであり、何か他のものを求めていると思った: – Ilja

0

ように私が何かをするだろう: `np.any(:私はより高速な方法を発見した

result = [any([n in row for n in matches]) for row in x_faces] 
+0

[Generator expressions](https://www.python.org/dev/peps/pep-0289/)が最も適しているこのような場合にはこの投稿['' any() '+ジェネレータ表現](http://)は、この[SO](http://stackoverflow.com/questions/47789/generator-expressions-vs-list-comprehension) /stackoverflow.com/questions/22108103/python-any-generator-expression)。また、[this](http://stackoverflow.com/a/35837818/3375713)では、リスト内包よりもジェネレータの表現が良い理由を説明しようとしました。 –

関連する問題