ここでは、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で放送することは非常に強力で、読み上げる価値があります。
非常に詳細な&素敵な説明だからここにあなたが
b
であるどのように多くのものを数える方法です。 Udacityディープ・ラーニング・コースを通っている人の大半は、この答えに遭遇したに違いありません。 – AgentX