Обозначение, которое вы используете, является действительным, но делает что-то очень отличное от того, что вы ожидаете. Numpy индексы состоят из кортежей, по одному элементу на измерение. Индекс, который вы пытаетесь получить, выглядит следующим образом
one[(12:15, 5:23)] = 255
Для удобства python позволяет убрать скобки, поэтому почти все напишут
one[12:15, 5:23] = 255
Полезно запомнить это просто сокращение для кортежа, содержащего объекты срезов, потому что иногда вам приходится создавать его извне.
Давайте посмотрим, что на самом деле делает ваш исходный индекс. Каждое выражение в скобках в python является вызовом __getitem__
или __setitem__
. Ваш индекс может быть переписан как
view = one[12:15] # __getitem__
view[5:23] = 255 # __setitem__
Вам разрешено передавать кортеж, который короче числа измерений. В этом случае ведущие измерения индексируются, а все остальные измерения неявно захватываются полностью. Практически это означает, что вы фактически делаете
view = one[12:15, :]
view[5:23, :] = 255
view
- это срез строк 12-14 включительно. Это массив 3х28. В соответствии с соглашением python, numpy позволяет вам назначать индексы после конца массива, ничего не делая. view
имеет только 3 строки, поэтому назначение строк 5-22 ничего не дает.
Надеюсь, это прояснит ситуацию в вашем редактировании. Если вы захватите строки 5-22, вы получите срез 18x28 ones
, смещенный на 5 строк. В этом срезе есть строки 12-14, поэтому вы в конечном итоге задаете строки 12 + 5, 13 + 5 и 14 + 5 в исходном массиве.