Расширенный синтаксис индексации упоминается в документе Python.
slice([start], stop[, step])
Объекты части также сгенерированы при расширении, индексируя синтаксис используется. Например: a[start:stop:step]
или a[start:stop, i]
. Посмотрите itertools.islice()
для альтернативной версии, которая возвращает итератор.
a[start:stop:step]
работы, как описано. Но что относительно второго? Как это используется?
a[start:stop,i]
вызывает метод a.__getitem__((slice(start,stop,None), i))
.
Это вызывает TypeError
, если a
- список, но это корректная и полезная нотация, если a
- массив numpy. На самом деле, я полагаю, что разработчики Numpy попросили разработчиков Python расширить допустимую нотацию нарезки Python именно для того, чтобы нотацию нарезки массива numpy было легче реализовать.
Например,
import numpy as np
arr=np.arange(12).reshape(4,3)
print(arr)
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
1:3
выбирает строки 1 и 2, а 2
выбирает третий столбец:
print(arr[1:3,2])
# [5 8]
PS. Чтобы поэкспериментировать с тем, какой фрагмент передается в __getitem__
, вы можете
поиграть с этим игрушечным кодом:
class Foo(list):
def __getitem__(self,key):
return repr(key)
foo=Foo(range(10))
print(foo[1:5,1,2])
# (slice(1, 5, None), 1, 2)
Обозначение [:,:]
используется для нарезки многомерные массивы . Python по умолчанию не имеет многомерных массивов, но его поддерживает синтаксис, и, например, numpy использует преимущества этого синтаксиса.