はじめに
Pythonの3点リーダー(...
)の意味について解説します。
機械学習のベストセラー「ゼロから作るDeep Learning」の2作目「2 自然言語処理編」にも多用されてる記法です。
リンク
結論
numpy.nadarrayにおける残りの軸を表します。
numpy.ndarrayのスライスの復習
軸の話をわかりやすくするために、
- 第1軸のサイズが1
- 第2軸のサイズが2
- 第3軸のサイズが3
- 第4軸のサイズが4
であるようなndarray
Aを考える。
1 | import numpy as np |
今後もこのAを、様々にスライスしshape
を確認します。
第1軸の0番目についてスライスをしたい時は以下のようにします。
1 | 0].shape a[ |
では、第2軸の0番目についてスライスをしたい時は?
1 | 0].shape a[:, |
このようにコロンを入れます。
では、第1軸と第4軸の0番目についてスライスをしたい時は?
1 | 0,:,:,0].shape a[ |
複数の:
の省略としての用法
では、以下のような6次元配列の、第6軸の0番目についてスライスをしたい時は?
1 | 1,2,3,4,5,6) B = np.random.rand( |
なんだか、コロンが多くて大変です。
こういった場面でElipsis
を使えます。
1 | 0].shape B[..., |
先ほどのコードと全く同じ動きです。
つまり、指定していない軸で、全て:
を指定したかのように動作します。
1 | 0,...,0].shape B[[:, |
とても便利ですね。
ndarrayのdeep copyに便利
これは、応用テクニックですが、deep copyに利用できます。
Bを書き換えると、Aも書き換わる
1
2
3
4
5
6
7A = np.ones((2,3))
B = np.zeros((2,3))
B = A
B *= 2
A
array([[2., 2., 2.],
[2., 2., 2.]])Bを書き換えても、Aも変わらない
1
2
3
4
5
6
7A = np.ones((2,3))
B = np.zeros((2,3))
B[:,:] = A
B *= 2
A
array([[1., 1., 1.],
[1., 1., 1.]])Bを書き換えても、Aも変わらない
1
2
3
4
5
6
7A = np.ones((2,3))
B = np.zeros((2,3))
B[...] = A
B *= 2
A
array([[1., 1., 1.],
[1., 1., 1.]])ellipsis
を使うとndarrayの次元数を気にせず使えるので、楽です。