view_as_windows на 4d массиве - PullRequest
0 голосов
/ 03 июля 2018

Учитывая ndarray формы (batch_size, w, h, c) и размера патча (p, p), я хочу извлечь патчи из каждой трехмерной матрицы (то есть формы (p, p, c). Никаких патчей будет перекрывать, поэтому шаг можно рассматривать как p.

Это должно вернуть массив с (batch_size * p * p, p, p, c)

Использование skimage.view_as_windows вот минимальный пример

import numpy as np
import skimage

a = np.arange(8*8*2).reshape((8, 8, 2))
b = a * 2
c = np.concatenate((a[np.newaxis, :, :, :], b[np.newaxis, :, :, :]), axis = 0)
d = skimage.util.view_as_windows(c, 2, step  = 2).reshape((8*2*2, 2, 2, 2))

Однако я ожидаю только альтернативные значения:

d[0]
Out[183]: 
array([[[ 0,  1],
        [ 2,  3]],
       [[16, 17],
        [18, 19]]])
d[1]
Out[184]: 
array([[[ 0,  2],
        [ 4,  6]],
       [[32, 34],
        [36, 38]]])
d[2]
Out[185]: 
array([[[ 4,  5],
        [ 6,  7]],
       [[20, 21],
        [22, 23]]])
d[3]
Out[186]: 
array([[[ 8, 10],
        [12, 14]],
       [[40, 42],
        [44, 46]]])
d[4]
Out[187]: 
array([[[ 8,  9],
        [10, 11]],
       [[24, 25],
        [26, 27]]])

Таким образом, d[::2] близко к моему решению, но половина значений потеряна

Я не уверен, является ли проблема размером окна или шагом, или даже если моя проблема возможна с помощью view_as_windows, поэтому я открыт для любого эффективного предложения.

1 Ответ

0 голосов
/ 05 июля 2018

Во-первых, я думаю, что вы хотите вернуть объем формы (batch_size * w/p * h/p, p, p, c)? то есть, если исправления не перекрываются, то произведение размеров должно быть одинаковым до и после исправления.

Получив это с дороги, вот моя попытка. Я изменяю размер пакета и размеры канала, чтобы было понятнее, какие именно.

import numpy as np
from skimage import util
batch = np.arange(4*8*8*3).reshape((4, 8, 8, 3))
blocked = util.view_as_blocks((1, 2, 2, 3))
patches = blocked.reshape((64, 2, 2, 3))
print(patches[0].transpose((2, 0, 1)))
print(patches[1].transpose((2, 0, 1)))

, что дает:

[[[0 1]
  [8 9]]

 [[0 1]
  [8 9]]

 [[0 1]
  [8 9]]]

и

[[[ 2  3]
  [10 11]]

 [[ 2  3]
  [10 11]]

 [[ 2  3]
  [10 11]]]

К сожалению, изменение формы вызывает копирование. Я не уверен, есть ли способ избежать этого, но, надеюсь, это не ваша основная проблема с вычислениями / памятью.

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