

初心者のため、ご教授お願いいたします。

2次元配列aと1次元配列bの値が、一致するかどうかの判定をしたいです。

[code]

    a = np.array([[1,1],[2,4],[2,6],[3,6],[4,6],[2,8],[4,8],[6,8],[3,9]]
    b = np.array([1,1])
    if (b != a).all():
        print("OK")
    else:
        print('NG')
    
[/code]

この結果

[code]

    NG
    
[/code]

と表示されてしまいます。


CC BY-SA 3.0
2017-11-01T10:24:25.507
39213
2017-11-01T15:53:55.760
2017-11-01T10:33:13.417
26010
26010
question
python
Python　2次元配列と1次元配列の一致要素有無の判定


こんな感じでしょうか。

[code]

    import numpy as np
    a = np.array([[1,1],[2,4],[2,6],[3,6],[4,6],[2,8],[4,8],[6,8],[3,9]])
    b = np.array([1,1])
    """
    >>> np.all(a==b, axis=1)
    array([ True, False, False, False, False, False, False, False, False], dtype=bool)
    """
    if np.all(a==b, axis=1).sum():
        print("OK")
    else:
        print("NG")
    
[/code]


CC BY-SA 3.0
2017-11-01T12:43:39.577
39218
2017-11-01T12:43:39.577
25868
39213
answer

[code]

    import numpy as np
    a = np.array([[1,1],[2,4],[2,6],[3,6],[4,6],[2,8],[4,8],[6,8],[3,9]])
    b = np.array([1,1])
    c = np.array([9,9])
    (a==b).all(axis=1).any() # => True
    (a==c).all(axis=1).any() # => False
    
[/code]

趣味はあると思いますが、僕はこの書き方が一番良いかと思います。  
まずはコードの説明から入ります。

[code]

    (a==b)  
    
[/code]

これはそれぞれの要素が等しいかどうかを調べます。  
aとbは同じshapeをもたないので、この計算にはnumpyのブロードキャストと呼ばれる機能を用いて、bをaと同じshapeであるとみなして等しいかそうでないかを判定しています。  
この比較においては要素の一つ一つに対して比較を行います。どのような結果が返るかはご存知と思いますが、知らない場合はipythonなどで検証してください。

[code]

    .all(axis=1)
    
[/code]

これはaxis=1(即ち行方向)に対して全ての要素がTrueならばTrueを返します。  
今はbという1次元の行に対して等値かそうでないかを判定したいのでこのような式を追加しています。

[code]

    any()
    
[/code]

これは上記の結果のうち一つでも真となるようなものがあるならばTrueを返し、そのほかはFalseを返します。  
僕はこの書き方が、問題に対して的確に表現できているということと、numpy関数を用いることでパフォーマンスを落とさずに処理できる点からこの書き方を私の答えとしたいです。

[code]

    (b != a).all()
    
[/code]

このコードがうまく動かない理由は、aの第一行目がbと同じであるため、(b!=a)という二次元配列の中にFalseと判定される要素が含まれていることと、all()は引数を使わずに呼び出した場合、全ての要素がTrueでなければFalseを返すということから、"NG"が出力されます。


CC BY-SA 3.0
2017-11-01T15:53:55.760
39224
2017-11-01T15:53:55.760
25980
39213
answer