Выбор случайных окон из числовых массивов, превышающих 2 измерения - PullRequest
1 голос
/ 28 октября 2019

Как я могу выбрать случайное окно из массива чисел больше двух измерений, в котором окно является случайным относительно двух разных измерений?

Я хотел бы сделать что-то похожее на ответ в этом посте, но в 3-х измерениях, а не в 2: Выбор случайных окон из многомерных рядов Numpy Array

Примерчто я пытаюсь векторизовать (т.е. я пытаюсь избежать цикла for):

import random
import numpy as np

ls = []
m = 3 # sequence length
k = 8 #batch_size

np_3D_array = np.random.randint(0,100, size = (5,7,4)) #random 3D array

for ii in range(k):
  random_sheet = random.randint(0,np_3D_array.shape[0] - 1)
  random_row = random.randint(0, np_3D_array.shape[1] - m)
  ls.append(np_3D_array[random_sheet, random_row:random_row + m , :])

final_output = np.array(ls)

print(final_output.shape) #prints (8, 3, 4) to stdoout

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Использование моего window_nd рецепта от здесь

def sample_nd(arr, window_shape, axis, k = 1):
    windows = window_nd(arr, window = window_shape, axis = axis)
    windows = windows.reshape((-1,) + windows.shape[len(axis):])
    index = np.random.randint(0, windows.shape[0], k)
    return windows[index].squeeze()

sample_nd(np_3D_array, window_shape = (1, 3), axis = (0, 1), k = 8).shape

(8, 3, 4)

Для ясности, здесь не учитывается множество крайних случаев, которые присутствуют в исходной функции (особенно если она не работает)только с одним окном / осью, если они не отформатированы как кортежи).

0 голосов
/ 28 октября 2019

Мы можем использовать np.lib.stride_tricks.as_strided на основе scikit-image's view_as_windows, чтобы получить раздвижные окна. Дополнительная информация об использовании as_strided на основе view_as_windows.

from skimage.util.shape import view_as_windows

w = view_as_windows(np_3D_array,(1,m,1))[...,0,:,0]
r1 = np.random.randint(0,np_3D_array.shape[0], k)
r2 = np.random.randint(0, np_3D_array.shape[1] - m + 1, k)
final_output = w[r1,r2].swapaxes(1,2)

Здесь view_as_windows - это удобная функция, которая помогает нам легко настраивать раздвижные окна, не вмешиваясь в настройкуas_strided функция.

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