Присвоение нескольких разных срезов оси NumPy / Torch одновременно - PullRequest
1 голос
/ 03 ноября 2019

У меня есть серия изображений (тензор 4d / массив с размерами "размер пакета x каналы x высота x ширина"), и я хотел бы нарисовать горизонтальные полосы нулей размера s на каждом изображении, но в разных строках для каждого изображения. Я могу сделать это тривиально с помощью цикла for, но я не смог выяснить векторизованную реализацию.

В идеале я бы сгенерировал 1-D тензор r "пакетных" случайных начальных точек и сделал бычто-то вроде t[:,:,r:r+s,:] = 0. Если я попробую это, я получу TypeError: only integer scalar arrays can be converted to a scalar index

Если я делаю игрушечный пример и просто пытаюсь вытащить две разные секции пакета только с двумя изображениями, делая что-то вроде t[:,:,torch.tensor(([1,2],[2,3])),:]Я получаю 5D-тензор, потому что он вытягивает оба этих разделов из обоих изображений в пакете. Как получить эти различные разделы, но только один для каждого изображения? В этом случаеесли бы вход был 2xCxHxW, я бы хотел 2xCx2xW, где первый элемент соответствует строкам 1 и 2 первого изображения, а второй элемент соответствует строкам 2 и 3 второгод изображение. Спасибо.

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете использовать эту функцию, которая создаст маску, в которой вы можете выполнять операции по оси Y или X по их индексу. Вы можете сделать это, упорядочив значения индекса x по индексу y.

bsg = sgs.data
device = sgs.device
bs, _, x, y = bsg.shape
max_y = y-size-1
rs = torch.randint(0, max_y, (bs,1), device=device)
m = torch.arange(y,device=device).repeat(bs, x)
gpumask = ((m < rs) | (m > (rs+size))).view(bs, 1, x, -1)
gpumask*bsg
...