note.nkmk.me

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

Date: 2019-03-19 / tags: Python, NumPy

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

ここでは以下の内容について説明する。

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

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

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

スポンサーリンク

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

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

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]]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事