Каково значение по умолчанию j в (i: j: k) numpy slicing?

Я читал учебник по numpy i: j: k slicing на Scipy.org . После второго примера говорится:

Предположим, что n – количество элементов в нарезанной размерности. Тогда, если i не задано, оно по умолчанию равно 0 при k> 0 и n – 1 при k <0 . Если j не задано, по умолчанию значение n при k> 0 и -1 при k <0 . Если k не задано, по умолчанию используется значение 1.

Однако:

>>> import numpy as np >>> x = np.array([0,1,2,3,4]) >>> x[::-1] array([4, 3, 2, 1, 0]) 

Если j по умолчанию равно -1, то x[:-1:-1] должно быть эквивалентно x[::-1] , но

 >>> x[:-1:-1] array([], dtype=int64) >>> x[:-(len(x)+1):-1] array([4, 3, 2, 1, 0]) 

в то время как

 >>> x[:-(len(x)+1):-1] array([4, 3, 2, 1, 0]) 

Таким образом, значение по умолчанию j, когда k <0 должно быть – (n + 1) . И согласно этому сообщению в stackoverflow , я считаю, что «официальное» значение по умолчанию j, когда k <0None .

Я неверно истолковал учебник на SciPy.org?

One Solution collect form web for “Каково значение по умолчанию j в (i: j: k) numpy slicing?”

На первом уровне обработки интерпретатор Python преобразует :: нотацию в объект slice . Это метод numpy.__getitem__ для интерпретации этих трех чисел.

[::-1] совпадает с slice(None,None,-1) .

Как вы заметили, x[slice(None,None,-1)] не совпадает с x[slice(None,-1,-1)] .

Я подозреваю, что -1 в:

If j is not given it defaults to n for k > 0 and -1 for k < 0 .

не предполагается таким образом. Скорее он имеет обычное значение -1, the number before 0 .

В [285]: np.arange (10) [slice (5,0, -1)] Out [285]: массив ([5, 4, 3, 2, 1])

j интерпретируется как iterate upto, but not including, this value , с направлением итерации, определяемой k . Поэтому значение 0 не включено в этот фрагмент.

Итак, как вы включаете 0 ?

 In [287]: np.arange(10)[slice(5,-1,-1)] Out[287]: array([], dtype=int32) 

не работает, потому что -1 понимается как n-1 , как в:

 In [289]: np.arange(10)[slice(5,-7,-1)] Out[289]: array([5, 4]) 

None не интерпретируется особым образом, который позволяет нам использовать:

 In [286]: np.arange(10)[slice(5,None,-1)] Out[286]: array([5, 4, 3, 2, 1, 0]) 

Это также работает ( 10-11=-1 – реальный -1 )

 In [291]: np.arange(10)[slice(5,-11,-1)] Out[291]: array([5, 4, 3, 2, 1, 0]) 

Таким образом, существует разница между -1 которая означает before 0 и -1 что означает count from n . Документация может быть понятна, но это не так (если вы используете правое -1).

  • Эффективный внешний продукт в python
  • Синтаксис среза для объекта
  • Нумерообразование в цифрах, используя списки в качестве аргументов
  • Быстрый способ нарезать изображение на перекрывающиеся патчи и слить патчи к изображению
  • Верхняя диагональ двумерного массива numpy
  • Пропустить каждый n-й индекс массива numpy
  • Ненужная нарезка из переменной
  • Почему numpy векторизованная функция, по-видимому, называется дополнительным временем?
  • Python - лучший язык программирования в мире.