Проблема с синтаксисом части списка в Python

Расширенный синтаксис индексации упоминается в документе Python.

slice([start], stop[, step])

Объекты части также сгенерированы при расширении, индексируя синтаксис используется. Например: a[start:stop:step] или a[start:stop, i]. Посмотрите itertools.islice() для альтернативной версии, которая возвращает итератор.

a[start:stop:step] работы, как описано. Но что относительно второго? Как это используется?

8
задан Hank Gay 3 May 2010 в 20:33
поделиться

2 ответа

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)
12
ответ дан 5 December 2019 в 10:40
поделиться

Обозначение [:,:] используется для нарезки многомерные массивы . Python по умолчанию не имеет многомерных массивов, но его поддерживает синтаксис, и, например, numpy использует преимущества этого синтаксиса.

4
ответ дан 5 December 2019 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: