python
1x = x[None, ...]
この処理は一体どのようなものなのでしょうか?
Chainerの勉強において、推論を行うために入力をミニバッチの形にするとあったのですが、Pythonに疎いためどのようなことが行われているのかわかりません。
ご回答よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
Pythonの文法というか、numpyのindexingに関する質問ですね。
非常に難解な話題なのですが、順を追って説明してみます。
それぞれの役割について
コロンの役割
コロン(:)を用いることで、任意のインデックスを表現できます。
Python
1arr = np.array([[1, 2, 3], [4, 5, 6]]) 2print( 3 arr[:, 0] # 任意のインデックスの0番目を使って作られるアレイ 4) 5 6"""出力 7[1 4] 8"""
全てのインデックスを任意にすると、当然元のアレイと同じものが得られます。
Python
1arr = np.array([[1, 2, 3], [4, 5, 6]]) 2print( 3 arr[:, :] # 全部任意 4) 5 6"""出力 7[[1 2 3] 8 [4 5 6]] 9"""
Ellipsisの役割
Ellipsis(...)を用いることで、連続したコロンを省略できます。
例えば次のような感じです。
Python
1arr = np.array([[1, 2, 3], [4, 5, 6]]) 2print( 3 arr[...] # 全部任意 4) 5 6"""出力 7[[1 2 3] 8 [4 5 6]] 9"""
ただこれだとうま味がないので、普通他のindexingと併せて使います。
Python
1arr = np.array([[[11, 12], [21, 22]], [[41, 42], [51, 52]]]) 2print( 3 arr[..., 0] # arr[:, :, 0] と同じ 4) 5 6"""出力 7[[11 21] 8 [41 51]] 9"""
元の次元に応じてよしなにコロンに拡張してくれます。
Noneの役割
NumPyにおいては、Noneが与えられたら一次元増やすという意味になっているようです。
ただこれだとわかりづらいので、np.newaxis
という名前をつけられています。
Python
1assert None is np.newaxis # 一応チェック 2 3arr = np.array([1, 2, 3]) 4print( 5 arr[np.newaxis, ...] 6) 7 8"""出力 9[[1 2 3]] 10"""
結論
Python
1x = x[None, ...]
この処理は一体どのようなものなのでしょうか?
全ての要素をそのままに、外側から新たにアレイでくるんで1次元増やしています。
次のように書いても同じ...だと思います。ちょっと自信ない。
Python
1x = np.array([x[...]])
追記: 単にこう書いてもいいみたい。
Python
1>>> arr = np.array([[1, 2, 3], [4, 5, 6]]) 2>>> arr = arr[np.newaxis] 3>>> print(arr) 4[[[1 2 3] 5 [4 5 6]]]
参考
Pythonの文法的には
いちおう、タイトルが『Pythonの文法について』なので。
Pythonのindexingは、そのオブジェクトの__getitem__
を呼び出します。
np.array.__getitem__
がタプル(None, ...)
を受け取って解釈します。
投稿2018/03/17 09:59
編集2018/03/17 13:38総合スコア35676
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/17 12:53
2018/03/17 13:36

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。