NumPy: Ellipsis (...) for ndarray | note.nkmk.me (original) (raw)
In NumPy, you can use the Python built-in constant Ellipsis
(represented as three dots, ...
) within []
to omit specifying intermediate dimensions of an array (ndarray
).
For information on how to set whether to omit elements when outputting ndarray
with print()
, refer to the following article.
Python built-in constant Ellipsis
(three dots, ...
)
In Python, Ellipsis
is defined as a built-in constant.
`print(Ellipsis)
Ellipsis
`
Ellipsis
can also be represented as ...
, consisting of three dots.
Ellipsis
and ...
are the same ellipsis
object.
`print(type(Ellipsis))
<class 'ellipsis'>
print(type(...))
<class 'ellipsis'>
print(Ellipsis is ...)
True
`
As of Python 3.12, Ellipsis
(...
) has no specific role in the basic syntax, but NumPy offers a practical application, as demonstrated below.
Ellipsis
(...
) in NumPy
In NumPy, Ellipsis
(...
) allows you to omit intermediate dimensions when specifying a range of an array (ndarray
) with []
.
Consider the following four-dimensional array as an example.
`import numpy as np
print(np.version)
1.26.1
a = np.arange(120).reshape(2, 3, 4, 5)
print(a.shape)
(2, 3, 4, 5)
`
For example, to specify only the last dimension, you can write it using :
like below.
`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]]]
`
Using ...
, it can be written as follows.
`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]]]
`
The same applies when specifying only the first and last dimensions. Intermediate dimensions can be omitted with ...
.
`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]]
`
You can also use Ellipsis
instead of ...
.
`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]]
`
In a four-dimensional example, the difference between using :
and ...
is minimal. However, ...
becomes more convenient for higher-dimensional arrays. While :
requires matching the number of dimensions, ...
does not have this requirement.
Using two or more ...
creates ambiguity about where to omit and results in an error.
`# print(a[..., 0, ...])
IndexError: an index can only have a single ellipsis ('...')
`
If :
is used for each dimension leading up to the last one, it can be entirely omitted. In such cases, there is no necessity to use ...
, though including it does not result in an error.
`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]]
`