NumPy配列ndarrayの次元をEllipsis(...)で省略して指定

NumPy配列ndarrayのインデックス[]で要素や範囲を指定するときにPythonの組み込み定数Ellipsis(3点ドット...)を使うと途中の次元を省略して指定できます。 ここでは以下の内容について説明します。

Pythonの組み込み定数Ellipsis(3点ドット...) NumPy配列ndarrayの次元を省略して指定

ndarrayをprint()などで出力するときに要素の表示を省略するかしないかを設定したい場合は以下の記事を参照。

なお、以下はPython3系(3.7.2)の場合。Python2系では振る舞いが異なることがあるので注意。

Pythonの組み込み定数Ellipsis(3点ドット ...)

Python3系では組み込み定数としてEllipsisが定義されています。

組み込み定数: Ellipsis — Python 3.7.3rc1 ドキュメント

print(Ellipsis)
# Ellipsis

ドット3つを連続した...(3点ドット)でも記述可能。

print(...)
# Ellipsis

Ellipsisと...は同じellipsisオブジェクト。

print(type(Ellipsis))
# <class 'ellipsis'>

print(type(...))
# <class 'ellipsis'>

print(Ellipsis is ...)
# True

Python3.7.2時点では基本文法としてEllipsis(...)の用途は特にないが、以下に示すように、NumPyではEllipsis(...)の便利な使い方が用意されています。

NumPy配列ndarrayの次元を省略して指定

NumPyではEllipsis(...)を使うと配列ndarrayのインデックス[]で要素や範囲を指定するときに途中の次元を省略できます。 以下の四次元配列を例とします。

import numpy as np

a = np.arange(120).reshape(2, 3, 4, 5)

print(a.shape)
# (2, 3, 4, 5)

例えば最後の次元だけを指定したい場合、:を使って以下のように書ける。

print(a[:, :, :, 0])
# [[[  0   5  10  15]
#   [ 20  25  30  35]
#   [ 40  45  50  55]]
#
#  [[ 60  65  70  75]
#   [ 80  85  90  95]
#   [100 105 110 115]]]

...を使うと以下のように書ける。

print(a[..., 0])
# [[[  0   5  10  15]
#   [ 20  25  30  35]
#   [ 40  45  50  55]]
#
#  [[ 60  65  70  75]
#   [ 80  85  90  95]
#   [100 105 110 115]]]

先頭と末尾の次元だけを指定したい場合も同様。途中の次元を...で省略できます。

print(a[0, :, :, 0])
# [[ 0  5 10 15]
#  [20 25 30 35]
#  [40 45 50 55]]

print(a[0, ..., 0])
# [[ 0  5 10 15]
#  [20 25 30 35]
#  [40 45 50 55]]

...ではなくEllipsisを使ってもよい。

print(a[Ellipsis, 0])
# [[[  0   5  10  15]
#   [ 20  25  30  35]
#   [ 40  45  50  55]]
#
#  [[ 60  65  70  75]
#   [ 80  85  90  95]
#   [100 105 110 115]]]

print(a[0, Ellipsis, 0])
# [[ 0  5 10 15]
#  [20 25 30 35]
#  [40 45 50 55]]

例は四次元なので:でも...でも大差ないが、さらに多次元だと...のほうが楽。:の場合は:の数を次元数に合わせないといけないが、...だと気にしなくてもよい。 当然ながら、...が2つ以上あるとどこを省略するか明確でないのでエラーになる。

# print(a[..., 0, ...])
# IndexError: an index can only have a single ellipsis ('...')

また、:が最後の次元まで繰り返される場合は:を省略可能。...を書く必要もない(書いてもエラーにはならない)。

print(a[0, 0, :, :])
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]

print(a[0, 0])
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]

print(a[0, 0, ...])
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]
#  [15 16 17 18 19]]

シェア

関連カテゴリー

Python NumPy

Pythonのリストと配列とnumpy.ndarrayの違いと使い分け Python, OpenCV, NumPyで画像のアルファブレンドとマスク処理 NumPy配列ndarrayに要素・行・列を挿入、追加するinsertの使い方 NumPy配列ndarrayの対角成分の抽出、対角行列の作成(diag, diagonal) NumPy配列ndarrayの条件を満たす要素数をカウント Pythonで正規化・標準化(リスト、NumPy配列、pandas.DataFrame) Python, NumPyでグラデーション画像を生成 NumPyの配列ndarrayの欠損値np.nanを他の値に置換 NumPy配列ndarrayをシフト(スクロール)させるnp.roll Python, NumPy(OpenCV)で画像を二値化処理 pandasからNumPyの関数などを使う方法(pd.np) NumPyで欠損値np.nanを含む配列ndarrayの合計や平均を算出 NumPy, randomで様々な種類の乱数の配列を生成 NumPy配列ndarrayの最大値・最小値のインデックス(位置)を取得 NumPy配列ndarrayを分割(split, array_split, hsplit, vsplit, dsplit)

Last Updated: 6/26/2019, 10:34:03 PM