Разница в маскировке массива - PullRequest
0 голосов
/ 27 мая 2019

У меня есть три пустых массива, один исходный массив, один целевой массив и один массив масок.Я хочу заменить значения в пункте назначения теми же значениями из источника только в тех местах, где маска равна единице.

Моя попытка naiive была:

import numpy as np
destination = np.arange(9).reshape((3,3))
source = np.ones((3,3))
mask = np.zeros((3,3)).astype(np.uint8)
mask[1,1]=1

destination[mask] = source[mask]

, что приводитя destination будучи

[[1, 1, 1],
 [1, 1, 1],
 [6, 7, 8]]

, тогда как я ожидаю, что это будет

[[0, 1, 2],
 [3, 1, 5],
 [6, 7, 8]].

Я получаю правильный результат, когда я

destination[mask==1] = source[mask==1].

Мойвопрос в том, почему эти две команды не идентичны или что делает первая?

1 Ответ

1 голос
/ 27 мая 2019

Сначала вы должны проверить внутри матриц и какая матрица дает вам то, что вы хотите.

mask

выход

[[0, 0, 0],
 [0, 1, 0],
 [0, 0, 0]]

но destination[mask == 1] дает вам логическую матрицу

mask == 1 

выход

[[False, False, False],
 [False,  True, False],
 [False, False, False]]

тогда:

destination[mask]

выход

[[[0, 1, 2],
  [0, 1, 2],
  [0, 1, 2]]

[[0, 1, 2],
 [3, 4, 5],
 [0, 1, 2]],

[[0, 1, 2],
 [0, 1, 2],
 [0, 1, 2]]]

, но использование destination[mask == 1] дает единственное значение, равное 4. То же самое для source[mask == 1], которое дает единственное значение 1.

и если вы используете destination[mask==1] = source[mask==1] вместо destination[mask] = source[mask], вы только измените значение 4 в матрице назначения.

Надеюсь, мое объяснение понятно.

Edit:

Надеюсь, я правильно понял ваш вопрос:

Простая целочисленная структура индексации x[[i]] дает вам i-ю строку матрицы.

Итак destination[0,1,2] дает:

[[0, 1, 2],
 [3, 4, 5],
 [6, 7, 8]]

и для понятного примера ввод destination[1,2,0] приводит к

[[3, 4, 5],
 [6, 7, 8],
 [0, 1, 2]]
...