a[start:stop,i]
вызывает метод a.__getitem__((slice(start,stop,None), i))
.
Это вызывает TypeError
, если a
- список, но это правильная и полезная нотация, если a
- массив с пустыми значениями. На самом деле, я считаю, что разработчики Numpy попросили разработчиков Python точно расширить действительную нотацию Python-среза, чтобы легче реализовывать нотацию среза массива.
Например,
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)