2017-10-15 3 views
1

は次のように行列してください:シングルパスでnumpy配列または行列列に2つの値のいずれかが存在するかどうかをテストするにはどうすればよいですか?

import numpy as np 
m = np.matrix([[1,1], 
       [2,0], 
       [3,1], 
       [5,1], 
       [5,0]]) 

次に、2つのテスト値取る:私はそれらの両方をテストすることができます(一つだけで、すべて該当する場合が存在することを保証していますどのように

n1 = 4 
n2 = 1 

を)その値を返しますか? 2回のパスを行うことは十分に簡単です:

if n1 in m[:, 0]: 
    return n1 
if n2 in m[:, 0]: 
    return n2 

メートルを通じて単一の外観に統合するための最良のnumpyの方法は何[:, 0]?

+0

https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.isin.htmlがありますが、実際にパスがいくつあるのか分かりません。 – user2357112

+0

ベストは、m [:、0]の値の場合:[n1、n2]の値の場合:戻り値 'のようなものかもしれません。しかし、私は、特にこのために何かがあるかもしれないと思った。 @ user2357112で共有されているnumpy.isinは、うまく動作しないように見えます。 –

答えて

2
m[:,0][(m[:,0] == n1) | (m[:,0] == n2)][0,0] 

説明:

m = np.matrix([[1,1], 
      [2,0], 
      [3,1], 
      [5,1], 
      [5,0]]) 
n1 = 4; n2 = 1; 

(m[:,0] == n1)n1のブール行列の存在

の存在

matrix([[False], 
    [False], 
    [False], 
    [False], 
    [False]], dtype=bool) 

(m[:,0] == n2)n2のブール行列を返す '返します

matrix([[ True], 
     [False], 
     [False], 
     [False], 
     [False]], dtype=bool) 

あなたは上記の二つは、どんな既存のパラメータのインデックスTrueを行いますINGの|n1n2パラメータの正確に一つが一度に存在すると言っているので。

(m[:,0] == n1) | (m[:,0] == n2) 

matrix([[ True], 
     [False], 
     [False], 
     [False], 
     [False]], dtype=bool) 

私達はちょうどEDITそれから

m[:,0][(m[:,0] == n1) | (m[:,0] == n2)][0,0] 
1 

を最初の要素を取得する上でブール配列、

m[:,0][(m[:,0] == n1) | (m[:,0] == n2)] 

matrix([[1]]) 

によってインデックスm[:,0]:numpyの1.13 +後

@John Zwinkが示すように、あなたはopeをコンパクトにすることができます最初の要素をnp.isin(m[:,0], [n1,n2])[:,0]とし、それから最初の要素を抽出します。np.where(np.isin(m[:,0], [n1,n2])[:,0])[0][0]

+0

Downvotedのため? – akilat90

+0

答えがうまくいっていないので、なぜこれが投票されたのかわからない+1 – kbball

2

mを1回だけ実行するとします。あなたはisin()(numpyの中を1.13+)を使用することができます:

mask = np.isin(m[:,0], [n1,n2])[:,0] 

あなたのN1またはN2の値が検出された場所Trueのブールマスクを与えること。もちろん

row = np.where(mask)[0][0] 

mと同じ長さであるmaskパススルーをとる:最初のそのような値を取ります。これをさらに最適化するには、NumbaまたはCythonを使用して、コンパイル済みループを使用してより直接的なソリューションを実装する必要があります。あなたはシンプルさと読みやすさが必要な場合は

+0

'isin()'について知らなかった。ありがとう! – akilat90

3

、最も単純には、設定されたロジックを見つけることができます:

{1,4} & set(m[:,0]) 

さらに、データが実際に読み込まれ、正確に1回。

+0

これは美しいです! +1 – akilat90

関連する問題