Я просто обнаружил - случайно - что массив в numpy
может быть проиндексирован пустым кортежем:
In [62]: a = arange(5)
In [63]: a[()]
Out[63]: array([0, 1, 2, 3, 4])
Я нашел некоторую документацию по NumPy вики ZeroRankArray:
(Саша) Во-первых, какой бы выбор ни был сделан для x [...] и x [()], они должны быть одинаковыми, потому что... это просто синтаксический сахар для "столько, сколько нужно", что в случае нуля ранг ведет к... = (:,) * 0 =(). Во-вторых, массивы с нулевым рангом и скалярные типы numpy взаимозаменяемы внутри numpy, но скалярные скаляры могут использоваться в некоторых конструкциях python, где ndarrays не могут.
Таким образом, для 0-d массивов a[()]
и a[...]
должны быть эквивалентны. Они тоже для многомерных массивов? Похоже, они:
In [65]: a = arange(25).reshape(5, 5)
In [66]: a[()] is a[...]
Out[66]: False
In [67]: (a[()] == a[...]).all()
Out[67]: True
In [68]: a = arange(3**7).reshape((3,)*7)
In [69]: (a[()] == a[...]).all()
Out[69]: True
Но это не синтаксический сахар. Не для многомерного массива и даже не для 0-го массива:
In [76]: a[()] is a
Out[76]: False
In [77]: a[...] is a
Out[77]: True
In [79]: b = array(0)
In [80]: b[()] is b
Out[80]: False
In [81]: b[...] is b
Out[81]: True
И затем есть случай индексации пустым списком, который делает что-то совсем другое, но кажется эквивалентным индексации с пустым ndarray
:
In [78]: a[[]]
Out[78]: array([], shape=(0, 3, 3, 3, 3, 3, 3), dtype=int64)
In [86]: a[arange(0)]
Out[86]: array([], shape=(0, 3, 3, 3, 3, 3, 3), dtype=int64)
In [82]: b[[]]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
IndexError: 0-d arrays can't be indexed.
Итак, кажется, что ()
и ...
похожи, но не совсем идентичны, и индексирование с помощью []
означает что-то совсем другое. А a[]
или b[]
- это SyntaxError
s. Индексация списками документируется в индексных массивах, и в конце того же документа есть краткое уведомление об индексации кортежами.
Это оставляет вопрос:
Разница между a[()]
и a[...]
дизайном? Каков дизайн, тогда?
(Вопрос чем-то напоминает: что делает пустой '()' на матрице Matlab?)
Редактировать:
Фактически, даже скаляры могут быть проиндексированы пустым кортежем:
In [36]: numpy.int64(10)[()]
Out[36]: 10