2016-04-10 14 views
14

私はPythonを初めて使い、TensorFlowを学んでいます。 のnotMNISTデータセットを使用するチュートリアルでは、ラベルマトリックスを1対nの符号化配列に変換するサンプルコードを示します。NumPy配列に適用された理解==

目的はラベル整数0 ... 9からなるアレイを取り、各整数は、このような一の-nの符号化された配列に変換された行列を返すことである。

0 -> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
1 -> [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 
2 -> [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 
... 

を彼らが提供するコードは次のとおりです:

# Map 0 to [1.0, 0.0, 0.0 ...], 1 to [0.0, 1.0, 0.0 ...] 
labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32) 

しかし、私はこのコードがどういうことをしているのか全く分かりません。それはちょうど0から9までの範囲の整数の配列を生成し、それをラベル行列と比較し、その結果をfloatに変換するようです。 ==演算子は、の1対nエンコード行列をどのようにして生成しますか?

答えて

22

ここでは、numpyのベクトル演算、シングルトン軸の追加、およびブロードキャストがあります。

まず、==がどのようにマジックを行うのかを確認する必要があります。

単純なラベル配列から始めましょう。 ==はベクトル化された形で動作します。つまり、配列全体をスカラーで比較し、各要素比較の値からなる配列を取得できます。たとえば:

>>> labels = np.array([1,2,0,0,2]) 
>>> labels == 0 
array([False, False, True, True, False], dtype=bool) 
>>> (labels == 0).astype(np.float32) 
array([ 0., 0., 1., 1., 0.], dtype=float32) 

まず、ブール配列を取得した後、我々は山車に強制:Pythonで偽== 0、および真== 1。だから、labelsが0と1に等しくない0の配列で巻き上げる。

しかし、0との比較についての特別な何もない、我々は同様の結果を得るための代わりに1または2または3に比較できます。実際には

>>> (labels == 2).astype(np.float32) 
array([ 0., 1., 0., 0., 1.], dtype=float32) 

を、私たちはあらゆる可能なラベルをループ可能性があり、この配列を生成します。

>>> np.array([(labels == i).astype(np.float32) for i in np.arange(3)]) 
array([[ 0., 0., 1., 1., 0.], 
     [ 1., 0., 0., 0., 0.], 
     [ 0., 1., 0., 0., 1.]], dtype=float32) 

しかし、これは本当にnumpyを利用していません。私たちがやりたいことは、それぞれの要素と比較して、各可能なラベルを持っているIOWが

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

>>> np.arange(3) 
array([0, 1, 2]) 

を比較し、numpyの放送の魔法の出番ここにあります。今、labelsがAであります形状の1次元オブジェクト(5、)。それを2次元の形状(5,1)のオブジェクトにすると、操作は最後の軸を「ブロードキャスト」し、shape(5,3)の出力を得ます。ラベルの各要素の範囲。

まず我々はNone(またはnp.newaxis)を使用してlabelsに「余分な」軸を追加することができ、その形状を変える:

>>> labels[:,None] 
array([[1], 
     [2], 
     [0], 
     [0], 
     [2]]) 
>>> labels[:,None].shape 
(5, 1) 

そして、我々は、これは我々がした配列の転置である(比較を行うことができます先に見て、それは本当に問題ではありません)。

>>> np.arange(3) == labels[:,None] 
array([[False, True, False], 
     [False, False, True], 
     [ True, False, False], 
     [ True, False, False], 
     [False, False, True]], dtype=bool) 
>>> (np.arange(3) == labels[:,None]).astype(np.float32) 
array([[ 0., 1., 0.], 
     [ 0., 0., 1.], 
     [ 1., 0., 0.], 
     [ 1., 0., 0.], 
     [ 0., 0., 1.]], dtype=float32) 

numpyで放送することは非常に強力で、読み上げる価値があります。

+0

非常に詳細な&素敵な説明だからここにあなたがbであるどのように多くのものを数える方法です。 Udacityディープ・ラーニング・コースを通っている人の大半は、この答えに遭遇したに違いありません。 – AgentX

0

簡潔に言えば、==はnumpyの配列に適用され、要素には==を配列に適用することを意味します。結果はブール値の配列です。次に例を示します。

>>> b = np.array([1,0,0,1,1,0]) 
>>> b == 1 
array([ True, False, False, True, True, False], dtype=bool) 

bにありますどのように多くの1秒と言うカウントする.astype(np.float32)を保存することができ、すなわち、Pythonのブールでのサブクラスであるので、あなたは、配列が浮かぶようにキャストする必要はありません。 intであり、Python 3ではTrue == 1 False == 0です。

>>> np.sum((b == 1)) 
3 

または::

>>> np.count_nonzero(b == 1) 
3 
関連する問題