【100 PyTorch exercises】 PyTorchを学ぼう 入門編 21~25問目

PyTorchの操作方法はNumpyの操作方法と似ています。

そのためNumpyが使用できれば同じような操作方法でPyTrochも扱えるという学習コストの低さが一つのメリットといえます。

しかし、多少の差異はどうしても存在します。

そこで、Numpyの練習に非常に役立つ「100 numpy exercises 」をPyTorchで書き換えることによって、PyTorchの操作方法を学ぶのと同時にNumpyとの類似点や相違点を学んでいきたいと思います。

github.com

PyTorchのコードだけでなくNumpyのコードもあわせて紹介していきます。

別記事に他の問題の解法も書いています。

次のリンクにまとめているので、他の問題もあわせて参考にしていただければと思います。

venoda.hatenablog.com




21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)

tile関数を使用して8×8のチェックボード行列を作成してください」

PyTorch

Z = torch.tile(torch.tensor([[0, 1], [1, 0]]), (4, 4))
print(Z)
# Output
tensor([[0, 1, 0, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 0],
        [0, 1, 0, 1, 0, 1, 0, 1],
        [1, 0, 1, 0, 1, 0, 1, 0]])

Numpy

Z = np.tile(np.array([[0, 1],[1, 0]]), (4, 4))
print(Z)
# Output
[[0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]]


22. Normalize a 5x5 random matrix (★☆☆)

「正規化したランダムな5×5の行列を作成してください」

PyTorch

Z = torch.rand((5, 5))
Z = (Z - torch.mean(Z)) / (torch.std(Z))
print(Z)
# Output
tensor([[-0.9945, -0.2888, -0.9787,  1.4048,  0.0891],
        [-0.6440, -1.4584,  1.3331,  1.5284, -0.7266],
        [ 0.6657, -0.3697, -0.5095, -1.5136,  1.1871],
        [ 1.2192,  0.6973, -0.7404, -0.4015, -0.6979],
        [-1.4543,  0.6214,  1.2800, -0.2047,  0.9565]])

Numpy

Z = np.random.random((5, 5))
Z = (Z - np.mean (Z)) / (np.std (Z))
print(Z)
# Output
[[ 1.20781347 -0.66186775  1.64449587 -0.94642327 -1.03134766]
 [ 1.74150852 -1.19851113  0.94146587 -0.61103834 -1.0082589 ]
 [ 1.10548369  0.21698998 -0.63352968 -1.44224467 -1.88830586]
 [-1.21032912  0.15881886 -0.30933339  0.74656479  0.19615455]
 [ 0.95124313  0.35474727  0.24919983  0.50687988  0.91982406]]




23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)

「4つの符号なしバイトとして記述される色のデータ型を作成してください」

PyTorch

PyTorchでの解法が見つかれませんでした。

Numpy

color = np.dtype([("r", np.ubyte),
                  ("g", np.ubyte),
                  ("b", np.ubyte),
                  ("a", np.ubyte)])
print(color)
# Output
[('r', 'u1'), ('g', 'u1'), ('b', 'u1'), ('a', 'u1')]


24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)

「5×3の行列に3×2の行列を掛けててください」

PyTorch

Z = torch.matmul(torch.ones((5, 3)), torch.ones((3, 2)))
print(Z)

Z = torch.ones((5, 3)) @ torch.ones((3, 2))
print(Z)
# Output
tensor([[3., 3.],
        [3., 3.],
        [3., 3.],
        [3., 3.],
        [3., 3.]])
tensor([[3., 3.],
        [3., 3.],
        [3., 3.],
        [3., 3.],
        [3., 3.]])

Numpy

Z = np.dot(np.ones((5, 3)), np.ones((3, 2)))
print(Z)

Z = np.ones((5,3)) @ np.ones((3,2))
print(Z)
# Output
[[3. 3.]
 [3. 3.]
 [3. 3.]
 [3. 3.]
 [3. 3.]]
[[3. 3.]
 [3. 3.]
 [3. 3.]
 [3. 3.]
 [3. 3.]]




25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)

「1次元配列の3から8までの要素をマイナスにしてください」

PyTorch

Z = torch.arange(11)
Z[(3 < Z) & (Z < 8)] *= -1
print(Z)
# Output
tensor([ 0,  1,  2,  3, -4, -5, -6, -7,  8,  9, 10])

Numpy

Z = np.arange(11)
Z[(3 < Z) & (Z < 8)] *= -1
print(Z)
# Output
[ 0  1  2  3 -4 -5 -6 -7  8  9 10]