2

0 と 1 の複数の行列があり、それらの NOT 化されたバージョンを見つけたいと考えています。例えば:

M  
0 1 0  
1 0 1  
0 1 0

次のようになります。

!M  
1 0 1  
0 1 0  
1 0 1

今私は持っている

for row in image:
    map(lambda x: 1 if x == 0 else 0, row)

これは完全にうまく機能しますが、ブロードキャストでこれが本当に簡単に行われるのを見たような気がします。残念ながら、私が調べたものはまだベルを鳴らしていません。行列の値をしきい値処理するために同様の操作が使用されると思います(つまり、 のようなもの1 if x > .5 else 0)。

4

2 に答える 2

7

0 と 1 の整数配列があるとします。

M = np.random.random_integers(0,1,(5,5))
print(M)
# [[1 0 0 1 1]
#  [0 0 1 1 0]
#  [0 1 1 0 1]
#  [1 1 1 0 1]
#  [0 1 1 0 0]]

NOT配列を作成する 3 つの方法を次に示します。

  1. ブール配列に変換し、~演算子を使用して配列をビットごとに処理します。NOT

    print((~(M.astype(np.bool))).astype(M.dtype))
    # [[0 1 1 0 0]
    #  [1 1 0 0 1]
    #  [1 0 0 1 0]
    #  [0 0 0 1 0]
    #  [1 0 0 1 1]]
    
  2. 結果のブール配列を使用numpy.logical_notしてキャストし、整数に戻します。

    print(np.logical_not(M).astype(M.dtype))
    # [[0 1 1 0 0]
    #  [1 1 0 0 1]
    #  [1 0 0 1 0]
    #  [0 0 0 1 0]
    #  [1 0 0 1 1]]
    
  3. 1 からすべての整数を引くだけです。

    print(1 - M)
    # [[0 1 1 0 0]
    #  [1 1 0 0 1]
    #  [1 0 0 1 0]
    #  [0 0 0 1 0]
    #  [1 0 0 1 1]]
    

3 番目の方法は、ほとんどの非ブール型 dtype でおそらく最も高速です。

于 2013-09-20T21:21:16.320 に答える
1

1つの解決策は、配列をブール配列に変換することです

data = np.ones((4, 4))
bdata = np.array(data, dtype=bool)
print ~bdata
于 2013-09-20T21:20:55.650 に答える