Назначение элементов в массиве numpy нулей - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь нарисовать «единицу» в массиве numpy np.zeros((28, 28)), присвоив определенные строки и столбцы 255. Я написал следующий код:

one = np.zeros((28, 28))
one[12:15][5:23] = 255

Вывод I ' После этого я получаю простой массив нулей без изменений. Может ли кто-нибудь объяснить это странное поведение?

Бонус

Если вы поменяете местами [12:15] и [5:23], строки с 17 по 19 будут заполнены 255.

Ответы [ 3 ]

5 голосов
/ 29 марта 2020

С помощью one[12:15][5:23] вы сначала выбираете строки от 12 до 15 (3 строки), затем выбираете строки от 5 до 23 из этих 3 строк. Эти строки не существует, то вы ничего не обновляете.

Синтаксис для обновления строк с 12 по 15, пересекаемых столбцами с 5 по 23:

one[12:15,5:23] = 255
2 голосов
/ 29 марта 2020

Обозначение, которое вы используете, является действительным, но делает что-то очень отличное от того, что вы ожидаете. 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 в исходном массиве.

0 голосов
/ 29 марта 2020

Чтобы расширить ответ jpl: ваш синтаксис был бы правильным, если бы вы имели дело со структурой данных списка python. Но вы имеете дело со структурой данных ndarray numpy, так что это не так, и синтаксис jpl правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...