Получите случайные 2D-срезы из массива 3D NumPy, ортогонально по каждому измерению

Я пытаюсь случайным образом выбрать 30% массива NumPy формы (790, 64, 64, 1). Последнее измерение — это информация о канале для изображения, поэтому, по сути, это 3D-изображение. Намерение состоит в том, чтобы генерировать 2D-срезы ортогонально по каждому измерению случайным образом, чтобы получить 30% общей информации оригинала.

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

Пока я могу генерировать только тот размер данных, который мне нужен.

dim1_len = 0.3 * img.shape[0]
dim2_len = 0.3 * img.shape[1]
dim3_len = 0.3 * img.shape[2]

Извините, если вопрос немного широк.


person Mallika Khullar    schedule 08.10.2020    source источник
comment
Не могли бы вы рассказать подробнее о создании 2D-срезов ортогонально? Было бы полезно, если бы вы включили пример ввода и ожидаемый результат.   -  person jakub    schedule 09.10.2020
comment
Это ответ на ваш вопрос или вы искали что-то другое?   -  person scleronomic    schedule 10.10.2020
comment
@scleronomic - meshgrid решил это - большое спасибо! +1 за примечание о коэффициенте уменьшения!   -  person Mallika Khullar    schedule 12.10.2020


Ответы (1)


Сначала несколько комментариев, вы говорите, что хотите сохранить 30% исходной информации. Если вы сохраните 30% каждой оси, вы получите только 0.3*0.3*0.3 = 0.027 (2,7%) информации. Рассмотрите возможность использования коэффициента уменьшения 0.3 ^(1/3)as. Следующее, что вы, возможно, захотите сохранить в пространственном порядке случайно выбранных индексов, поэтому, возможно, включите np.sort(...) в вопрос, который вы связали.

Теперь к основному вопросу: вы можете использовать np.meshgrid(*arrays, sparse=True, indexing='ij') для получения списка массивов, которые можно использовать для трансляции. Это удобно для добавления необходимой новой оси к случайным индексам.

import numpy as np

img = np.random.random((790, 64, 64, 1))
alpha = 0.3 ** (1/3)

shape_new = (np.array(img.shape[:-1]) * alpha).astype(int)
idx = [np.sort(np.random.choice(img.shape[i], shape_new[i], replace=False))
       for i in range(3)]
# shapes: [(528,)  (42,)  (42,)]

idx_o = np.meshgrid(*idx, sparse=True, indexing='ij')
# shapes: [(528, 1, 1)
#          (1,  42, 1)
#          (1,  1, 42)]

img_new = img[tuple(idx_o)]
# shape: (528, 42, 42, 1)
person scleronomic    schedule 09.10.2020